ScrollPane和TitledPane的JavaFX查找问题

时间:2015-07-23 03:57:25

标签: java javafx javafx-8 lookup scene

我有一个名为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。

2 个答案:

答案 0 :(得分:1)

对于具有getContent()(而不是getChildren())方法(例如ScrollPaneTitledPane)的布局,似乎在显示场景后查找将起作用。所以你可以尝试将查找代码包装成runnable:

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

答案 1 :(得分:0)

尝试在getContent()之前使用lookup(...)

titledPane.getContent().lookup("#id")