ScrollPane和TitlePane的JavaFX查找问题

ScrollPane和TitlePane的JavaFX查找问题,java,javafx,javafx-8,lookup,scene,Java,Javafx,Javafx 8,Lookup,Scene,我有一个名为modSelectorScene的场景,基于场景生成器中创建的fxml,其根元素是滚动窗格。滚动窗格包含一个VBox,其中包含几个标题窗格,每个标题窗格包含一个AnchorPane,每个标题窗格包含几个按钮 当我尝试使用modSelectorScene.lookup()和每个按钮的fx:id将按钮分配给代码中的按钮对象时,所有问题都开始了——每个按钮都显示为空。我发现我可以为滚动窗格分配一个fx:id并查找它,但没有其他功能。如果我将滚动窗格包装在一个锚面板中,并将其中一个按钮移动到

我有一个名为modSelectorScene的场景,基于场景生成器中创建的fxml,其根元素是滚动窗格。滚动窗格包含一个VBox,其中包含几个标题窗格,每个标题窗格包含一个AnchorPane,每个标题窗格包含几个按钮

当我尝试使用modSelectorScene.lookup()和每个按钮的fx:id将按钮分配给代码中的按钮对象时,所有问题都开始了——每个按钮都显示为空。我发现我可以为滚动窗格分配一个fx:id并查找它,但没有其他功能。如果我将滚动窗格包装在一个锚面板中,并将其中一个按钮移动到锚面板中,我可以使用查找方法正常地访问它

所以我现在看到的解决方案是交替调用ScrollPane上的getContent()和getChildren(),以及其中的所有内容,以挖掘我的方法,从而获得我的按钮。这很有效,但不太……优雅。所以我想知道的是,为什么按钮和所有其他元素在滚动窗格后面时对查找方法是不可见的,以及是否有任何方法可以解决这个问题

这里有一个例子:

modSelectorScene = new Scene(FXMLLoader.load(getClass().getResource("Dialog/ModSelector.fxml")));
...
ScrollPane modScrollPane = (ScrollPane) modSelectorScene.lookup("#modScrollPane");
Button modStr = (Button) modSelectorScene.lookup("#modStr");

例如,尝试向modStr添加EventHandler会抛出NullPointerException,但ScrollPane按预期分配。甚至直接在其中的VBox在查找时也会返回空值。

对于具有
getContent()
(而不是
getChildren()
)方法(如
ScrollPane
titlePane
)的布局,在显示场景后,查找将工作。因此,您可以尝试将查找代码包装为可运行:

Platform.runLater(() ->
{
    // lookup code
});

查找(…)
之前尝试使用
getContent()


为什么不让fxml的控制器参与进来呢。毕竟,向控件添加事件处理程序是控制器imo的工作,在该控制器类中,您可以通过向按钮注入@FXML注释来轻松获得按钮。请看@UlukBiy是的,我们曾考虑将其转换为使用控制器类和FXML注释,但我们使用的方法已经深入到项目中,我们很快就会有一个截止日期,所以我们可能会等到以后再做任何类似的重大修改。这可能是我们最终使用的,但现在我很好奇是否存在另一种解决方案。好吧,这很有帮助。我能够将查找代码和EventHandler移动到一个方法中,该方法在显示modSelectorStage后调用,并且看起来正常工作。谢谢
titledPane.getContent().lookup("#id")