所以,我想要做的是,使用fxml创建一个自定义元素,然后将该元素的几个实例添加到容器中,如GridPane。 “new”运算符对我不起作用,因为我想使用@fxml注释器来访问该元素。克隆会很好,但它不起作用。当在for()contruct中使用添加许多元素时,FXMLLoader非常慢。 如果我可以写一个fxml parentnode的引用,它可以从控制器调用,这将是完美的。
对不起......这里是伪...
public class Controller implements Initializable {
@FXML
private VBox stack;
@FXML
private Button button;
@FXML
private void Change(KeyEvent event) throws IOException {
for (int i=0; i<10; i++){
stack.getChildren().add(button);
}
}
}
将THE按钮添加到VBox是没有问题的。但是在for-contruct中(添加多于一个按钮)它失败了。我可以在for构造中使用new运算符,但我想知道,如果这是唯一的可能性。我认为必须有另一种方式,例如使用@FXML注释器“获取”按钮,然后复制它。
答案 0 :(得分:4)
我认为它失败了,因为你试图一遍又一遍地添加相同的按钮。在for循环中,每次循环中的代码运行时都需要创建一个按钮实例。
类似的东西:
@FXML
private void Change(KeyEvent event) throws IOException {
for (int i=0; i<10; i++){
stack.getChildren().add(new Button("test")) ;
}
}
如果我误解了你,请告诉我。
答案 1 :(得分:1)
如果要访问该按钮,只需为其创建类变量。
private Button okButton = null;
private Button cancelButton = null;
在initialize()方法中,初始化Button并添加到容器中。
okButton = new Button("OK");
cancelButton = new Button("Cancel");
stack.getChildren().addAll(okButton, cancelButton) ;
然后你可以处理按钮动作事件:
cancelButton.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent arg0) {
try {
//close screen
((Button)arg0.getSource()).getScene().getWindow().hide();
} catch (Exception e) {
}
}
});