我有一个名为modSelectorScene的场景,它基于在Scene Builder中制作的fxml,其根元素是ScrollPane。 ScrollPane包含一个VBox,其中包含一些TitledPanes,每个TitledPanes都包含一个AnchorPane,每个包含一些Buttons。
当我尝试使用modSelectorScene.lookup()和每个按钮的fx:id将按钮分配给我的代码中的Button对象时,问题全部开始了 - 每个按钮都变为空。我发现我可以为ScrollPane分配一个fx:id并查找它,但没有别的。如果我将ScrollPane包装在一个AnchorPane中并将其中一个按钮移动到AnchorPane中,我可以通过查找方法正常使用它。
所以我现在正在寻找的解决方案涉及在ScrollPane上交替调用getContent()和getChildren()以及其中的所有内容,以便向下挖掘我的按钮。这有效,但它不是很优雅。所以我想知道的是,为什么Buttons和所有其他元素在查找方法中是不可见的,而它们落后于ScrollPane,以及是否有任何方法可以解决这个问题。
以下是一个例子:
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也会在查找时返回null。
答案 0 :(得分:1)
对于具有getContent()
(而不是getChildren()
)方法(例如ScrollPane
和TitledPane
)的布局,似乎在显示场景后查找将起作用。所以你可以尝试将查找代码包装成runnable:
Platform.runLater(() ->
{
// lookup code
});
答案 1 :(得分:0)
尝试在getContent()
之前使用lookup(...)
:
titledPane.getContent().lookup("#id")