将信息传递给JavaFX Button handle()例程

时间:2017-02-08 19:40:41

标签: java user-interface button javafx

我有以下代码在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编程问题。什么是最佳做法?

感谢。

1 个答案:

答案 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 ;
}

这个想法的一些变化总能满足你的需要。