使用一个按钮javafx以干净的方式执行多个操作

时间:2016-03-31 10:59:35

标签: java events button javafx action

我想知道是否有办法使用单个JavaFX Button并根据另一个条件对此Button执行不同的操作(例如:如果选择了第一个选项,则在单击时执行一个操作,当选项二等时,动作二)以干净的方式。

我可以用if语句来表达,这很明显,但我希望有一些体面和干净的方法来做到这一点。

你能否提出一些想法来实现这个目标?

2 个答案:

答案 0 :(得分:0)

将处理程序与选项相关联。你可以做到,例如这使用Map<Option, EventHandler<ActionEvent>>或简单地通过在自己的选项中实现功能。

以下示例允许用户选择关闭打印Hello World到控制台或关闭ComboBox中的应用程序:

// handler with a given return value for toString()
public abstract class NamedEventHandler implements EventHandler<ActionEvent> {

    private final String name;

    public NamedEventHandler(String name) {
        this.name = name;
    }

    @Override
    public final String toString() {
        return name;
    }

}
ComboBox<EventHandler<ActionEvent>> comboBox = new ComboBox<>(FXCollections.observableArrayList(
        new NamedEventHandler("Print \"Hello World\"") {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World");
            }
        }, new NamedEventHandler("Close") {
            @Override
            public void handle(ActionEvent event) {
                Platform.exit();
            }
        }
));

Button button = new Button("OK");
button.setOnAction((ActionEvent event) -> {
    EventHandler<ActionEvent> handler = comboBox.getValue();
    if(handler != null) {
        handler.handle(event);
    }
});

使用Map map存储事件处理程序,您可以使用

EventHandler<ActionEvent> handler = map.get(comboBox.getValue());

而不是

EventHandler<ActionEvent> handler = comboBox.getValue();

答案 1 :(得分:0)

我认为你可以使用方法图,类似的东西:

Map<String, Method> actions = new HashMap();

然后,准备好调用方法:

Method method1 = classInstance.getClass().getMethod("myMethodOne")
Method method2 = classInstance.getClass().getMethod("myMethodTwo")
...

并使用方法及其名称填充地图:

actions.put("methodOne", method1);
actions.put("methodTwo", method2);

因此,根据在TextField(或任何内容)中输入的文本,您可以调用所需的方法,例如:

String nameMethodToInvoke = myTextField.getText();
Method methodToInvoke = actions.get(nameMethodToInvoke);
methodToInvoke.invoke()