2017-10-13 103 views
0

我正在嘗試使JavaFX GUi與運行的Socket通信結合使用。JavaFX Controller mehtod來自其他類的調用

所以我得到了4個類。

SocketClient:正在處理數據輸入/輸出。當客戶端連接到服務器時,GUI上的標籤應該改變。

private void openSocket() { 
    try { 
     client = new Socket(); 
     client.setReuseAddress(true); 
     client.connect(new InetSocketAddress(SERVER_IP,SOCKET_PORT),10); 
     //Where do I get the Controller From? 
     //guiController = loader.getController(); 
     //guiController.setLabel("Connected"); 
    }catch (Exception e) { 
    } 
} 

GUIController:此控制器應該在客戶端連接時設置標籤的文本。

public void setLabel(String status) { 
    label.setText(status); 
} 

GUI:正在加載GUI(裝載GUI.FXML ....)

FXMLLoader loader = new FXMLLoader (getClass().getResource("GUI.fxml")); 
     VBox root = (VBox)loader.load(); 
     guiController = loader.getController(); 
     \\This is Working 
     guiController.setLabel("test"); 
     Scene scene = new Scene(root,root.getPrefWidth(),root.getPrefHeight()); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
     mainStage.setScene(scene); 
     mainStage.setResizable(false); 
     mainStage.show(); 

主營:推出的GUI(圖形用戶界面:推出(GUI.class)

所以在哪裏以及如何使用控制器來設置標籤

回答

0

如果你嚴格遵守模型 - 視圖 - 控制器的概念,我不會按照你想要的方式來完成它,模型不應該訪問控制器/直接查看控制器應該調用模型。

enter image description here

MVC Wikipedia

但是,你當然可以這樣做的。只需將啓動Controller/View時存儲的controller變量存儲起來,並將其從MainApp傳遞到任何您想要的地方並從那裏調用方法。

+0

那麼控制器詢問模型(SocketClient)是否有新的數據? – Waeuk

+0

如果你嚴格遵循這個概念,是的。理論上,模型應該是完全獨立的。控制器是管理視圖的等級。正如我所說的,你總會找到一種「違反」的方式,有時會更容易,但對於這樣一個簡單的事情,我會堅持這個概念。 –

+0

控制器是否可以作爲線程運行,因爲它需要定期詢問套接字上是否存在某些數據。 – Waeuk