我有以下代码在JavaFX 8中设置一个Button:
Button button = new Button("target name");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Button pressed = (Button)event.getSource();
// next target name is the title of the button
handleClick(pressed.getText());
}
});
我想将一些信息传递给handleClick()
例程。在这种情况下,我有一个字符串,它是一个“目标名称”,handleClick()
是一个知道如何处理它的方法。现在我通过将其作为Button的名称来传递该信息。有没有更好的办法?例如,如果我想传递两条信息怎么办?或者,如果我想传递的信息不是字符串怎么办?
handle()
例程只接受ActionEvent
参数。我在ActionEvent
找不到任何可以帮助我的内容。
我有一个想法:也许我可以编写自己的扩展Button的SmartButton
子类,并在该子类中包含一些在SmartButton
构造时传入的其他信息(所以我只能实现一个额外的构造函数和一个或多个新的getter / setter。然后,handleClick()
例程可以通过(SmartButton)event.getSource()
上调用的getter访问该信息。
这似乎是一个常见的UI编程问题。什么是最佳做法?
感谢。
答案 0 :(得分:2)
在您发布的代码段中,事件处理程序仅与第一行中创建的按钮相关联。此外,由于它是一个匿名内部类,您知道您只有该类的一个实例,因此该事件处理程序不能与任何其他控件相关联。所以你的代码完全等同于
Button button = new Button("target name");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
handleClick(button.getText());
}
});
或使用lambda表达式:
Button button = new Button("target name");
button.setOnAction(event -> handleClick(button.getText()));
即使处理按钮所需的数据不是按钮中的文本,您基本上也可以这样做。考虑一个计算器应用程序(为简单起见,将其限制为整数)。您可能会有一些变量存储显示的当前值:
private int value ;
然后你想要一堆数字按钮,它们将自己的值“附加”到当前值(所以如果当前值为1而你按“2”,则当前值应为12,等等):
你只需要
for (int i = 0 ; i <= 9 ; i++) {
Button button = createButton(i);
// place button in UI...
}
带
private Button createButton(int buttonValue) {
Button button = new Button(Integer.toString(buttonValue));
button.setOnAction(e -> value = value * 10 + buttonValue);
return button ;
}
这个想法的一些变化总能满足你的需要。