【问题标题】:Post render event in JavaFX在 JavaFX 中发布渲染事件
【发布时间】:2013-05-30 20:35:47
【问题描述】:

我正在尝试给一个TableView的所有列标题的标签添加一个点击事件监听器,如下:

for (final Node header : tblView.lookupAll(".column-header > .label")) {         
    if ((header != null) && (header instanceof Label)) {
        final Label headerLabel = (Label) header;
        // ...
    }
}

现在的问题是,如果我在 Controller 的 initialize() 函数中执行此操作,则尚未渲染场景图,并且上面的代码将无法工作。因此我的问题是:是否存在某种渲染后事件?

非常感谢。

【问题讨论】:

    标签: javafx-2


    【解决方案1】:

    javafx.stage.WindowEvents 中有一个WINDOW_SHOWN 事件。这不是(imo)“渲染后事件”,但您可以通过将事件处理程序添加到Stage(从Window 扩展)以类似的方式使用它。

    在控制器类的initialize方法中,获取初级阶段,然后:

    stage.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
        @Override
        public void handle(WindowEvent window) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    addListenerToColumnHeaders();
                }
            });
        }
    });
    

    希望这会有所帮助,因为我自己没有尝试过。

    【讨论】:

    • 此事件处理程序按预期工作,谢谢!然而,在主控制器的initialize() 中进入初级阶段本身就是一个问题,看起来......一种解决方案是在主类中获取控制器,但这会将应用程序类和主控制器。
    • @Biy 我的应用程序有多个控制器,我需要在一些 UI 流程的中间进行此操作。当我添加您提到的 WindowEvent.WINDOW_SHOWN 事件处理程序时,它将尝试执行这个事件处理程序位置,我已经声明这意味着执行应用程序的 start(Stage 方法),然后我得到一些空指针异常。你能告诉我如何解决这个问题。谢谢。
    • @Channa,回答了您的相关问题。请看一看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多