gpt4 book ai didi

JavaFX 使用 Platform.runLater 从另一个线程更新 TextArea

转载 作者:行者123 更新时间:2023-11-30 10:21:39 26 4
gpt4 key购买 nike

我正在尝试使用来自另一个实现 Runnable 的类的 Platform.runLater 更新 TextArea。我的所有 GUI 都在一个类中(我的 TextArea 所在的位置),我正在创建一个 new server 线程并在创建 gui 时运行它。我正在尝试使用 Server 线程中的 Platform.runLater 来更新我的 TextAreaPlatform.runLater 无法访问我的文本区域。

public class SimulationWindow {
public SimulationWindow instance() {
return this;
}
public static void DisplaySimulationWindow() throws FileNotFoundException {
Stage SimuStage = new Stage();
SimuStage.initModality(Modality.APPLICATION_MODAL);
SimuStage.setTitle("Simulation Window");
Server myServer = new Server(instance());
Thread serverThread = new Thread(myServer);
serverThread.start();
TextArea serverTextArea;
.
.
.
}

public class Server implements Runnable {
@Override
public void run() {
while(true){
whileConnected();
.
.
}
private void whileConnected() throws IOException {

sendMessage(message);

do {
try {
message = (String) input.readObject();
showMessage(message);
.
.
.
}
private void showMessage(String x) {
Platform.runLater(() -> serverTextArea.appendText(x));
}

我尝试将我的 SimulationWindow 实例传递给服务器构造函数,就像他们在这里所做的那样:Modifying JavaFX gui from different thread in different class

但是 Java 不会让我的 SimulationWindow 实例作为服务器构造器的参数传递。其他解决方案将 hold Server 和 SimulationWindow 类作为一个类,但我想将它们分开。任何提示表示赞赏!

最佳答案

我按照 kleopatra 的建议解决了这个问题。我将一个 TextArea 传递给了我的服务器构造函数。我想从我的 GUI 类以及从服务器类中的客户端获取消息时更新我的​​ GUI 中的 TextArea。 (我在 SimuWindow() 中创建并启动我的服务器)

public class myGUI{
public void SimuWindow(){
//this method creates all the GUI.
Server myServer = new Server(serverTextArea);
Thread serverThread = new Thread(myServer);
serverThread.start();

sendingTest = new TextField();
sendingTest.setPromptText("test communication here");
sendingTest.setOnAction(event -> {
String message = new String ("\nServer says: ");
message = message + sendingTest.getText();
serverTextArea.appendText(message);
myServer.sendMessage(message);
sendingTest.clear();
});
}
}

public class Server implements Runnable{
//This is my server class that connects and listens to clients
TextArea mytextArea;
public Server(TextArea x) {
this.mytextArea = x;
}
private void whileConnected() throws IOException {
do {
try {
message = (String) input.readObject();
showMessage(message);
}catch(ClassNotFoundException classNotFoundException) {
System.out.println("\n i dont know the message");
}
}while(!message.equals("Disconnected"));

private void showMessage(String mess) {
Platform.runLater(() -> mytextArea.appendText(mess));
}
}

我在我的客户端类上做了同样的事情。感谢您的帮助。

关于JavaFX 使用 Platform.runLater 从另一个线程更新 TextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47752400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com