5

所以,我想做的是,使用 fxml 创建一个自定义元素,然后将该元素的几个实例添加到一个容器中,比如 GridPane。“新”运算符对我不起作用,因为我想使用 @fxml 注释器来访问元素。克隆会很好,但它不起作用。FXMLLoader 在使用 for() 结构添加许多元素时非常慢。如果我可以将引用写入 fxml 父节点,那将是完美的,它可以从控制器调用。

对不起...这里是伪...

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-construct(添加多个按钮)中它失败了。我可以在 for 构造中使用 new 运算符,但我想知道这是否是唯一的可能性。我认为必须有另一种方法,例如使用@FXML 注释器来“获取”按钮然后复制它。

4

2 回答 2

7

我相信它失败了,因为您试图一遍又一遍地添加相同的按钮。在 for 循环中,每次运行循环中的代码时,您都需要创建一个按钮的实例。

就像是:

@FXML
private void Change(KeyEvent event) throws IOException {     
    for (int i=0; i<10; i++){
        stack.getChildren().add(new Button("test")) ;   
    }   
}

如果我误解了你,请告诉我。

于 2012-07-30T19:08:03.443 回答
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) {

            }
        }
    });
于 2012-07-31T02:15:38.033 回答