问题描述
所以我试图在我的控制器类中修改一些圈子,并且我将圈子链接到我的fxml文件圈子但是当我尝试将它们添加到圆圈阵列以便于管理时,他们似乎失去了他们的参考。例如,我有:
So I'm trying to modify some circles in my controller class, and i've linked the circles to my fxml file circles but when i try to add them to a circle array for easy management, they seem to lose their reference. For example I have:
@FXML
private Circle circle1 = new Circle();
public void addNumber(ActionEvent event){
circle1.setLayoutX(355.0);
circle1.setLayoutY(100.0);
circle1.setVisbility(true);
}
上述方法成功地在给定坐标中弹出一个圆圈。但是以下方法不起作用:
The above method successfully makes a circle pop up in the given coordinates. However the following doesnt work:
@FXML
private Circle circle1 = new Circle();
@FXML
private Circle[] c = {circle1};
public void addNumber(ActionEvent event){
c[0].setLayoutX(355.0);
c[0].setLayoutY(100.0);
c[0].setVisbility(true);
}
这不起作用!尝试过阵列试过arraylist尝试过的链表,对circle1的引用就是迷失了。我是JAVAFX的菜鸟,所以这可能是一个简单的修复,但我试图研究一下,尝试了不同的实现,让它工作,我似乎无法找到解决方案。
我们非常感谢任何帮助!
This doesn't work! Tried array tried arraylist tried linkedlist, the reference to circle1 just gets lost. I'm a noob at JAVAFX so this might be a simple fix but i've tried to research a bit, tried different implementations to get it to work and i cant seem to find the solution.Any help would be much appreciated!
推荐答案
这应提供足够的信息以帮助您入门。
This SSCCE should provide enough information to get you started.
给出以下FXML文件:
Given the following FXML file:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="yourapplication.FXMLDocumentController">
<children>
<Button layoutX="22.0" layoutY="31.0" mnemonicParsing="false"
onAction="#addNumber" text="Button" />
<Circle fx:id="circle1" fill="DODGERBLUE" layoutX="56.0" layoutY="118.0"
radius="34.0" stroke="BLACK" strokeType="INSIDE" visible="false" />
</children>
</Pane>
以下控制器代码:
public class FXMLDocumentController {
@FXML
private Circle circle1;
private Circle[] c;
public void initialize() {
c = new Circle[] { circle1 };
}
public void addNumber(ActionEvent event) {
c[0].setLayoutX(355.0);
c[0].setLayoutY(100.0);
c[0].setVisible(true);
}
}
你应该得到你想要的结果。
you should get the results you desire.
注意:
- 使用
FXML
用于将变量绑定到FXML文件中同名元素的注释。 - 变量不需要
FXML
注释在FXML文件中没有定义。 - 我不认为数组等基元可以定义为FXML。
- 对圆圈的引用应该在
初始化
方法中设置,因为在将变量绑定到FXML文件中的元素之后调用它。 - 如果你使用
FXML
注释标记Node
变量,您不需要在控制器代码中设置引用,因为这样做加载FXML文件时会被覆盖(这是问题的根源,请参阅Tomsontoms答案)。
- Use the
FXML
annotation to bind your variables to elements of the same name within your FXML file. - An
FXML
annotation is not required for variables that are not defined in the FXML file. - I don't think primitives such as arrays can be defined FXML.
- the reference to the circle should be set in the
initialize
method as this is called after the variable is bound to the element in the FXML file. - if you mark a
Node
variable with theFXML
annotation you don't need to set a reference in the controller code as this will be overwritten when the FXML file is loaded (which is the root of your problem, see Tomsontoms answer).
这篇关于有一个问题,javafx对象一旦被放入数组就会丢失引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!