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

JAVAFX-无法设置文本字段的文本,java,javafx,Java,Javafx,我对服务使用有一个“小”问题。 下面的代码不起作用:HMI中的文本值没有更新,但其值是正确的 public class FilterController { @FXML private TextField totalItemCount; private final Service service = new Service() { @Override protected Task createTask() {

我对服务使用有一个“小”问题。 下面的代码不起作用: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();
    }
}
公共类过滤器控制器
{
@FXML
私有文本字段totalItemCount;
专用最终服务=新服务(){
@凌驾
受保护的任务createTask()
{
返回新任务(){
@Override protected Void call()引发异常{
int x=(int)(Math.random()*10000);
System.out.println(“x=”+x);
试一试{
totalItemCount.setText(Integer.toString(x));
System.out.println(“totalItemCount=“+totalItemCount.getText());
}
捕获(可丢弃的ex)
{
系统错误打印项次(“失败”);
例如printStackTrace();
}
返回null;
}
};
}
@凌驾
受保护的void失败()
{
super.failed();
System.err.println(“失败”);
}
};
@FXML
公共无效处理FindProblemSevent()
{
System.out.println(“处理查找问题”);
service.restart();
}
}
我没有任何错误。失败消息没有显示,所以我可以认为工作已经完成,但事实并非如此。 这是一个bug还是一个糟糕的用法? 谢谢你的帮助


注意:我使用jre1.8.0_25

您没有在任何地方调用
failed()
方法。

我假设您的任务在自己的线程中执行,因此您需要将对fx API的调用与平台同步。runLater

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

您在那里所做的是尝试从后台线程更新一个TextField,并且将抛出一个
IllegalStateException

任务
服务
类用于在后台计算一些东西,然后进行GUI更新

与解释的和一样,您应该创建一个
任务
,并返回计算值。如果此操作成功,您可以使用
getValue()
succeed()
方法中检索该值,并将该值设置为
TextField

正在从GUI线程调用
successed()
方法,因此可以安全地更新此处的
TextField

抱歉,我的描述不完整。对于这个测试用例,我在HMI中有一个按钮和一个文本字段。按钮的操作execute handleFindProblemsEvent()方法,该方法启动线程(service.restart())如果服务出错,则会提供该方法failed()。我不需要调用这个方法。你能解释一下吗。我不太清楚为什么在这种情况下需要使用runLater。事实上,在我的实际应用程序中,textField totalItemCount与一个属性绑定(这里没有看到),但为了减少问题,我使用了setText代替绑定机制。你说过我必须只为setText使用runLater吗?很抱歉,我没有看到任何异常,但是你的回答在这种情况下很有趣,因为我必须在这个过程结束时更改textfield。所以在这种情况下,这是一个很好的解决方案。好吧,线程不能做GUI,那么如果我需要定期更新GUI组件,我们该怎么做呢?对于固定间隔的定期更新,请使用时间线:非常感谢所有这些解释。