我试图在JavaFX中实现一个MVC解决方案,就像我以前用swing一样。在我看来,有一些差异。我通常的做法是有一个Starter class
来初始化一个view
和model
并将它们传递给带有构造函数的controller
。然后,我会给view
提供controller
的引用,以便它可以注册用于UI处理。然后,我会在controller
需要访问的任何GUI元素上使用setActionCommand("xy");
。 setActionCommand();
ist不适用于JavaFX。我也看到了我应该为不同元素使用不同控制器的帖子,如here所示。
我开始实施它,因为我习惯了,我现在卡在无法为按钮分配方法的地步。我的3个按钮是这样的:用一个控制器处理多个JavaFX按钮
Button newGraph = new Button("Neuer Graph");
newGraph.setOnAction(controller);
Button extendGraph = new Button("Graph erweitern");
extendGraph.setOnAction(controller);
Button reset = new Button("Filter zurücksetzen");
reset.setOnAction(controller);
我的控制器看起来是这样的:
public class GraphController implements EventHandler {
private GraphHandler graphHandler; //model
private GraphView graphView; //view
public GraphController(GraphHandler graphHandler, GraphView graphView, Stage stage){
this.graphHandler = graphHandler;
this.graphView = graphView;
graphView.registerController(this); //introduce controller to view
graphView.start(stage); //start the main frame
}
@Override
public void handle(Event event) {
System.out.println(event.getSource().toString());
}
}
哪些呢打印:
[email protected][styleClass=button]'Filter zurücksetzen'
[email protected][styleClass=button]'Neuer Graph'
[email protected][styleClass=button]'Graph erweitern'
我如何能够区分按钮,而无需使用if(event.getSource().toString().equals("[email protected][styleClass=button]'Filter zurücksetzen'"));
或财产以后的喜欢?
我也期待在CheckBox
和MenuItem
上使用它。
编辑:
部分解决它通过解析sender
到一个按钮。
@Override
public void handle(Event event) {
try {
Button sender = (Button) event.getSource();
switch (sender.getText()){
case "Filter zurücksetzen":
System.out.println("reset");
break;
case "Neuer Graph":
System.out.println("new");
break;
case "Graph erweitern":
System.out.println("extend");
break;
}
} catch (Exception e){
e.printStackTrace();
}
}
有没有更通用的方法?因为我不想解析其他事件,这会导致更多的try, catch
块。尽管这可能是codereview
在这一点的问题..
通常的方法是简单地使用不同的处理程序为每个控制。有没有理由不想这么做? –
我不希望我的应用程序充满'controller'类,但仍然使用'mvc patter',但是如前所述,我还不知道如何在JavaFX中正确执行此操作。 –
那么你不一定要为每一个类都有不同的类,只是使用不同的实例。或者只是使用lambda表达式(请参阅hostz的答案)以尽量减少代码开销(或匿名内部类,尽管这些与lambda表达式相比较是冗长的)。 –