我知道一些避免这种情况的方法,例如在不同的节点中添加相同的ActionHandler:
// Custom Event Handler
EventHandler<ActionEvent> myHandler = e -> {
//code
};
inputField.setOnAction(myHandler);
// okButton
okButton.setOnAction(myHandler);
但是我可以在Node类中看到方法
fireEvent(Event)
。问题是我有多个TextFields
,当按下名为Button
的okButton
时,我想一次将它们全部触发。那怎么办?如果这对您没有太大意义,请说出于研究原因我想要它:)。
最佳答案
根据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);
}
}