如何从后台工作者更新 fxml 标签?
How to update fxml Label from a background worker?
我的 fxml 文件中有一个标签:
<Label fx:id="labelA"/>
我想在后台工作程序执行期间在控制器中更新它。我试过这样做:
public class FXHelloCVController
{
@FXML
private Label labelA;
@FXML
protected void startMatching(ActionEvent event)
{
SwingWorker<Boolean, String> worker = new SwingWorker<Boolean, String>()
{
@Override
protected Boolean doInBackground() throws Exception
{
for(int y=0; y<*something*; y++){
if(n.get(y)!=null){
...
publish(n.get(y).name);
...
}
}
return true;
}
@Override
protected void process(List<String> chunks) {
String n = chunks.get(chunks.size()-1);
labelA.setText(n);
}
};
worker.execute();
return;
}
但是调用函数"labelA.setText(n)"时,出现如下异常:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0
怎么了?
SwingWorker 用于 Swing 而不是用于 JavaFX。查看相应 JavaFX 并发机制的文档。
Platform.runLater:如果您需要从非 GUI 线程更新 GUI 组件,您可以使用它来将您的更新放入队列中,它会尽快由 GUI 线程处理.
Platform.runLater(new Runnable() {
@Override public void run() {
// update an FXML node (e.g. label)
}
});
来源:Platform.runLater and Task in JavaFX
但是您使用的是 Swing 和 JavaFX,这通常不是。
我的 fxml 文件中有一个标签:
<Label fx:id="labelA"/>
我想在后台工作程序执行期间在控制器中更新它。我试过这样做:
public class FXHelloCVController
{
@FXML
private Label labelA;
@FXML
protected void startMatching(ActionEvent event)
{
SwingWorker<Boolean, String> worker = new SwingWorker<Boolean, String>()
{
@Override
protected Boolean doInBackground() throws Exception
{
for(int y=0; y<*something*; y++){
if(n.get(y)!=null){
...
publish(n.get(y).name);
...
}
}
return true;
}
@Override
protected void process(List<String> chunks) {
String n = chunks.get(chunks.size()-1);
labelA.setText(n);
}
};
worker.execute();
return;
}
但是调用函数"labelA.setText(n)"时,出现如下异常:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0
怎么了?
SwingWorker 用于 Swing 而不是用于 JavaFX。查看相应 JavaFX 并发机制的文档。
Platform.runLater:如果您需要从非 GUI 线程更新 GUI 组件,您可以使用它来将您的更新放入队列中,它会尽快由 GUI 线程处理.
Platform.runLater(new Runnable() {
@Override public void run() {
// update an FXML node (e.g. label)
}
});
来源:Platform.runLater and Task in JavaFX
但是您使用的是 Swing 和 JavaFX,这通常不是。