你能告诉我,在哪里我应该为节点声明我的事件监听器,这些节点是在我的控制器类中添加的吗?
最好的方法是用这个例子来解释它:
我有我的控制器:
public class FXMLDocumentController implements Initializable {
@FXML
private AnchorPane root;
@Override
public void initialize(URL url, ResourceBundle rb) {
TestTask test = new TestTask(root);
Thread th = new Thread(test);
th.start();
}
}
然后我有了Task,它是在initialize方法中启动的:
public class TestTask extends Task<Void>{
private AnchorPane root;
public TestTask(AnchorPane root){
this.root = root;
}
@Override
protected Void call() throws Exception {
Button btn = new Button("TestButton");
Platform.runLater(() -> { root.getChildren().add(btn); });
return null;
}
}
我在这做什么?我有一个带有AnchorPane作为根元素的FXML。它有id根。所以现在我启动Task,在其中我将一个Button添加到我的根节点。现在我想在按钮上注册一个动作事件。我的问题是,我在哪里可以/应该注册听众。通常我会在控制器中注册它们,但在这里我不能这样做,因为Button只存在于Task类中。我可以在Task类中注册它,但我认为它不适合大型应用程序。另一种方法是返回节点,以便我可以在控制器类中访问它,但在这里我必须检查它是否已经添加(为此我必须调用task.get()
,这将停止我的应用程序那么现在你能告诉我:为节点注册监听器的最佳方法是什么?
答案 0 :(得分:0)
不要在后台线程中创建UI。 (充其量)很少需要这样做。如果您需要执行一些长时间运行的任务来检索创建UI所需的数据,请从任务中返回数据,并在任务的auto_increment
处理程序中创建UI:
onSucceeded
和
public class SomeControllerClass {
@FXML
private AnchorPane root ;
public void initialize() {
Task<SomeDataType> task = new MyTask();
task.setOnSucceeded(e -> {
// this method executed on FX Application thread.
SomeDataType result = task.getValue();
// now create UI and update root, using the data retrieved
});
Thread thread = new Thread(task);
thread.start();
}
}