当前位置: 首页 > 知识库问答 >
问题:

在哪里向节点添加事件?

寇照
2023-03-14

你能告诉我,我应该在哪里声明节点的事件侦听器,它们是在我的控制器类之外添加的?

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

我有我的控制器:

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

然后我有任务,它在初始化方法中启动:

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;
    }
}

我在这里做什么?我有一个FXML,根元素是锚烷。它具有id根。现在我开始了一个任务,在这个任务中,我向根节点添加了一个按钮。现在我想向按钮注册一个动作事件。我现在的问题是,我可以/应该在哪里注册听众。通常我在控制器中注册它们,但在这里我不能这样做,因为按钮只存在于任务类中。我可以在任务类中注册它,但我认为它不能很好地扩展到大型应用程序。另一种方法是返回节点,以便我可以在控制器类中访问它,但这里我必须检查它是否已经添加(为此,我必须调用task.get(),这会停止我的应用程序。那么现在你能告诉我:为节点注册侦听器的最佳方法是什么?

共有1个答案

刁英朗
2023-03-14

不要在后台线程中创建UI。(充其量)很少需要这样做。如果需要执行一些长时间运行的任务来检索创建UI所需的数据,请从任务返回数据,并在任务的后续处理程序中创建UI:

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

}

public class MyTask extends Task<SomeDataType> {

    @Override
    public SomeDataType call() {

        SomeDataType result = longRunningProcess();
        return result ;
    }
}
 类似资料:
  • 我需要在XML中保留很少的值,并且需要通过XSLT添加新的节点。 价值需要保留,新的选项需要添加。 如何实现这一点。下面是我的代码。 有人能帮忙吗? 谢谢

  • 我正在将XML返回到一个jsp页面。 最终的XML结构如下所示: 的根节点作为向量返回,我使用xtream将其别名为“tasks”,如上图所示。 如何使用XStream实现这一点?我需要使用XSLT文件来转换XML输出吗?完成这一点的最佳方法是什么?

  • 问题内容: 我正在使用自签名证书向服务器发出https请求(使用请求模块)。如果我未指定为选项,则会引发错误。 我的OS(OSX)已信任此证书,因此Chrome从该服务器访问网页时不会引发错误。 我了解不同的应用程序/环境可能具有自己的证书存储。Firefox拥有自己的操作系统,例如,JVM通常位于$ JAVA_HOME / jre / lib / security / cacerts(在OSX上

  • 我有一个XML: 我想向根元素:/doc添加一个属性(名称空间),以便输出如下所示: 我尝试了三种xslt(跳过了默认的“复制所有”部分以减少问题的长度)。 xslt1:见下文,问题在于将空名称空间xmlns=”“添加到/doc的所有子节点(即:/doc/tag1和/doc/tag2) Xslt2:见下文,问题是“ns”被添加到根节点:和 xslt3:请参见下文,问题是报告了错误:未定义名称空间前

  • 我创建了一个简单的应用程序来模拟JAVAFX的动态节点创建。这个应用程序能够通过单击“新建”按钮在用户需要的时候创建一个新窗口。用户可以通过单击“添加任务”按钮,然后单击对话框窗口上的“添加”按钮,将标题窗格的新节点添加到窗口中。 我想修复一个意外行为。此应用程序仅将新节点(在本例中为TitledPane)添加到最后创建的窗口。并且上一个窗口上的所有节点都将消失。 你可以看下面的视频来更好地理解我

  • 错误:没有创建firebase应用程序调用firebase.InitializeApp我的问题:我应该在哪里添加firebase初始化 带有firestore引用“Users”的无状态小部件 注意:这个dart文件'feedback.dart'不包含void main函数,它是一个无状态小部件