我試圖在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表達式相比較是冗長的)。 –