在哪里向节点添加事件?

时间:2016-01-27 11:44:05

标签: java javafx

你能告诉我,在哪里我应该为节点声明我的事件监听器,这些节点是在我的控制器类中添加的吗?

最好的方法是用这个例子来解释它:

我有我的控制器:

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(),这将停止我的应用程序那么现在你能告诉我:为节点注册监听器的最佳方法是什么?

1 个答案:

答案 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();
    }

}