JAVAFX - 无法设置文本字段的文本

时间:2014-12-25 18:48:16

标签: java javafx

我对服务使用有一个“小”问题。 下面的代码不起作用:文本值不在HMI中更新,但其值是正确的!!?

public class FilterController
{
    @FXML
    private TextField       totalItemCount;

    private final Service service = new Service() {
        @Override
        protected Task createTask() 
        {
            return new Task<Void>() {
                @Override protected Void call() throws Exception {

                    int  x = (int) (Math.random() * 10000);
                    System.out.println("x = " + x);

                    try {
                        totalItemCount.setText(Integer.toString(x));
                        System.out.println("totalItemCount = " + totalItemCount.getText());
                    }
                    catch (Throwable ex)
                    {
                        System.err.println("Fail");
                        ex.printStackTrace();
                    }
                    return null;
                }
            };
        }

        @Override
        protected void failed()
        {
            super.failed();
            System.err.println("FAILED");
        }
    };

    @FXML
    public void handleFindProblemsEvent()
    {
        System.out.println("Handle Find Problems");
        service.restart();
    }
}

我没有任何错误。未显示失败消息,因此我可以认为已完成工作但情况并非如此。 这是一个错误还是一个糟糕的用法? 谢谢你的帮助。

注意:我使用jre1.8.0_25

3 个答案:

答案 0 :(得分:0)

您尚未在任何地方调用failed()方法。

答案 1 :(得分:0)

我假设您在自己的线程中执行Task,因此您需要使用Platform.runLater同步调用fx API

答案 2 :(得分:0)

JavaFX是一个单线程GUI工具包,因此每次更新GUI组件都必须在主应用程序(JavaFX)线程上完成。

你在那里做的是尝试从后台线程更新TextField,并且IllegalStateException会被抛出。

TaskService类用于在后台计算某些内容,然后进行GUI更新。

与解释over hereover here一样,您应该创建一个Task<Integer>并返回计算值。如果此操作成功,您可以使用succeeded()检索getValue()方法中的值,并将值设置为TextField。 从GUI线程调用succeeded()方法,因此可以安全地更新TextField