クライアントアプリケーションにguiを追加しました。 とソケットメッセージを転送しようとしました。 私はクライアントを今までシングルトンに嘲笑して なので、Application
スレッド からアクセスできましたが、今は複数のクライアントからGUIにアクセスしたいと思っています。 fxml
にはバインドされたプロパティリスナーがありますが、 できるだけ簡単にしたいと思います。 スレッド自体を直接操作する。 どうすれば Application.launch()
が独自に構築されている場合、 シーンインスタンスを参照できますか? 私は非常に広範囲に読んだことがありますが、どこでもソリューションを提供しています fxml
インターフェイスを利用して、私が気に入らない作品をスキップしています。 Controlクラス(簡略化され、9行上の問題):JavaFXアプリケーションのシーンを別のスレッドから変更しますか?
public class Client {
private Socket socket = new Socket("127.0.0.1",4444);
private BufferedReader incoming = new BufferedReader(new InputStreamReader(socket.getInputStream()));
private Browser browser = new Browser();
public static void main(String[] arguments) throws IOException {
Application.launch(browser.class);
while(socket.isConnected()) {
Platform.runLater(new Runnable(){
@Override public void run(){
try{browser.bubble(incoming.readLine());}
catch(IOException fail){fail.printStackTrace();}
}
});
}
}
}
ユーザーインターフェイス(簡体字):あなたが唯一のこれまで作成したインスタンスは、あなたのApplication
サブクラスのインスタンスを1つ持っている必要があり
public class Browser extends Application {
private Stage stage;
private Scene scene;
private BorderPane layout = new BorderPane();
private VBox history = new VBox();
@Override public void start(Stage stage) throws Exception {
layout.setCenter(history);
scene = new Scene(layout);
stage = stage;
stage.setScene(scene);
stage.show();
}
public void bubble(String message){
VBox record = new VBox();
Label label = new Label(message);
record.getChildren().add(label);
history.getChildren().add(record);
}
}
大部分の場合、mainメソッド以外の場所から 'Application.launch()'を呼び出すべきではありません。メインメソッドでは何もしないでください。これを逆にしてください。私。あなたの 'start()'メソッドから 'Client'インスタンスを作成し、そこから(あなたがバックグラウンドスレッドで)投稿したコードを含むメソッドを呼び出してください。あなたはまだスレッドの問題があります - あなたは 'readLine()'呼び出しでfxアプリケーションスレッドをブロックしています。 –
申し訳ありませんが、訂正したpsvmメソッドを追加していませんでした。私はあなたが描く原則が好きで、メインメソッドで何も他のものをアプリケーションからインスタンス化しています...そのインスタンスを3番目のスレッドにディスパッチすると、ブロッキングの問題も解決できませんでした。 – bpstrngr