2017-10-13 10 views
0

私はJavaFX GUiとSocket通信の実行を組み合わせようとしています。JavaFXコントローラmehtodの他のクラスからの呼び出し

私は4つのクラスを得ました。

SocketClient:Data In/Outputを処理しています。クライアントがサーバーに接続されると、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.class)

:GUI(GUIを起動していますコントローラを使用してラベルを設定する場所と方法を教えてください。

答えて

0

Model-View-Controllerのコンセプトに厳密に従えば、私はそれをやりたいようにしません。 /直接表示。コントローラモデルを呼び出す必要があります。

enter image description here

MVC Wikipedia

ただし、もちろんそのように行うことができます。コントローラー/ビューを起動するときに持っている変数controllerを保存し、MainAppから必要な場所に渡してそこからメソッドを呼び出すだけです。

+0

すると、コントローラはモデル(SocketClient)に新しいデータを要求しますか? – Waeuk

+0

あなたが厳密にコンセプトに従えば、はい。理論的には、モデルは完全に独立していなければなりません。コントローラは、ビューに配置されるものを管理するレベルです。私が言ったように、あなたはいつもそれを「違反する」方法を見つけ出し、時にはより簡単になりますが、このような簡単なことのために私はそのコンセプトに固執します。 –

+0

コントローラはスレッドとして実行できます。なぜなら、Socketに何らかのデータがあるかどうか定期的に確認する必要があるからです。 – Waeuk

関連する問題