【发布时间】:2017-11-10 10:59:34
【问题描述】:
我已向我的客户端应用程序添加了一个 gui,
并尝试将套接字消息转发给它。
直到现在我还嘲笑客户是单身人士,
所以我可以从Application 线程访问它,
但现在我希望多个客户访问他们的 gui。
我知道fxml 绑定了属性监听器,但是
我希望它尽可能简单。
直接使用线程本身。
我如何让Platform.runLater() 引用
如果Application.launch() 构建自己的场景实例?
我已经阅读了相当广泛的内容,但到处都有解决方案
结果是利用fxml 界面跳过了我不喜欢的工作。
控制类(简化,第 9 行发布):
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();}
}
});
}
}
}
用户界面(简化):
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(),也不应该在 main 方法中执行任何其他操作。反过来做; IE。从您的start()方法创建您的Client实例并调用包含您从那里发布的代码的方法(在后台线程中)。您仍然有线程问题 - 您正在使用readLine()调用阻塞 fx 应用程序线程。 -
是的,对不起,我错过了包含 psvm 方法,已更正。我喜欢你绘制的原则,在主方法中没有其他内容并从应用程序实例化......将该实例分派到第三个线程也可以解决阻塞问题......我可能会这样下去。
标签: java multithreading user-interface javafx concurrency