JAVAFX-无法设置文本字段的文本
我对服务使用有一个“小”问题。 下面的代码不起作用:HMI中的文本值没有更新,但其值是正确的JAVAFX-无法设置文本字段的文本,java,javafx,Java,Javafx,我对服务使用有一个“小”问题。 下面的代码不起作用:HMI中的文本值没有更新,但其值是正确的 public class FilterController { @FXML private TextField totalItemCount; private final Service service = new Service() { @Override protected Task createTask() {
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的调用与平台同步。runLaterJavaFX是一个单线程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组件,我们该怎么做呢?对于固定间隔的定期更新,请使用时间线:非常感谢所有这些解释。