我想知道是否有办法使用单个JavaFX Button
并根据另一个条件对此Button
执行不同的操作(例如:如果选择了第一个选项,则在单击时执行一个操作,当选项二等时,动作二)以干净的方式。
我可以用if语句来表达,这很明显,但我希望有一些体面和干净的方法来做到这一点。
你能否提出一些想法来实现这个目标?
答案 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()