我知道一些避免这种情况的方法,例如在不同的节点中添加相同的ActionHandler:

        // Custom Event Handler
        EventHandler<ActionEvent> myHandler = e -> {

             //code

        };

        inputField.setOnAction(myHandler);

        // okButton
        okButton.setOnAction(myHandler);


但是我可以在Node类中看到方法fireEvent(Event)。问题是我有多个TextFields,当按下名为ButtonokButton时,我想一次将它们全部触发。

那怎么办?如果这对您没有太大意义,请说出于研究原因我想要它:)。

最佳答案

根据OP的要求,我正在添加我的评论作为答案。

您可以使用.fireEvent(new ActionEvent())触发TextField动作处理程序。

我完成此操作的方式是存储/获取所有TextField,然后在按下Button时,遍历每个.fireEvent(new ActionEvent());。下面的小型控制器示例。 VBox来自FXML文件。

public class Controller {

    @FXML private VBox root;
    private List<TextField> all = new ArrayList<>();

    public Controller(){}
    @FXML
    public void initialize(){
        EventHandler<ActionEvent> customEvent = e -> {
            if(e.getSource().getClass() == Button.class){
                all.forEach(t -> t.fireEvent(new ActionEvent()));
            }else {
                System.out.println(((TextField) e.getSource()).getText());
            }
        };

        for(int i=0; i < 10; i++){
            TextField tf = new TextField(Integer.toString(i));
            tf.setOnAction(customEvent);
            all.add(tf);
            root.getChildren().add(tf);
        }
        Button btn = new Button();
        btn.setOnAction(customEvent);
        root.getChildren().add(btn);
    }

}

10-08 04:32