JavaFX:任务不会更新 UI

标签 java multithreading concurrency javafx task

我正在开发一个用 javaFX+java 编写的奥马哈在线扑克客户端。

我需要在 control.call() 执行完成后显示一个包含 3 个按钮的anchorPane。 我知道 control.call() 已完成执行,但由于某种原因 task.setOnSucceeded(new EventHandler() {) 的处理方法不会更新用户界面。

我做错了什么?

public void newRound() {

    sog = StateOfGame.PREFLOP;       

     ControlGameOnNewThread control = new ControlGameOnNewThread();

    Task task = new Task() {

        @Override
        protected Object call() throws Exception {
            control.call();
            return null;
        }
    };

    task.setOnSucceeded(new EventHandler() {

        @Override
        public void handle(Event event) {
            if (client.getAction() == FirstToAct.me) {
                System.out.println("Task finsished");
                    showOptions(client.getToCall());
                    opponentBetField.setText(new Integer(opp.chipsInvested).toString());
                    myBetField.setText(new Integer(client.chipsInvested).toString());
                    System.out.println("Task finsished");

            }
    }
    });


    new Thread(task).start();


}

最佳答案

问题是您正在另一个线程中更新用户界面..如果您在另一个线程中并且想要更新用户界面

您需要调用

<小时/>
Platform.runLater(new Runnable() {
  @Override public void run() {
    //Update UI here     
  }
});

调用此函数将调用主线程并将所有必要的更新更新到用户界面

编辑

public void newRound() {

    sog = StateOfGame.PREFLOP;       

     ControlGameOnNewThread control = new ControlGameOnNewThread();

    Task task = new Task() {

        @Override
        protected Object call() throws Exception {
            control.call();
            return null;
        }
    };

    task.setOnSucceeded(new EventHandler() {

        @Override
        public void handle(Event event) {

            if (client.getAction() == FirstToAct.me) {

                Platform.runLater(new Runnable() {
                  @Override public void run() {
                    System.out.println("Task finsished");
                    showOptions(client.getToCall());
                    opponentBetField.setText(new Integer(opp.chipsInvested).toString());
                    myBetField.setText(new Integer(client.chipsInvested).toString());
                    System.out.println("Task finsished");     
                  }
                });
            }
    }
    });


    new Thread(task).start();


}

关于JavaFX:任务不会更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23209245/

相关文章:

java - 查询数据存储时出现错误消息

Java - 在另一个方法之前调用一个方法

java - 在 Java 中拆分字符串以提供所需的输出

c++ - 不能使用互斥锁读取共享数据会导致任意的陈旧数据吗?

java - 如何从线程调用 UIThread 上的方法?

java - 我的 JDialog 有时会收到来自调用应用程序的多余按键? (提供代码)

python - RESTful API 中使用的 Etag 仍然容易受到竞争条件的影响

Java并发控制多把锁

java - 将 java 代码转换为 Objective C 的问题

java - 产量法困惑