提问者:小点点

ScrollPane和TitledPane的JavaFX查找问题


我有一个名为modSelectorScene的场景,基于在Scene Builder中制作的fxml,其根元素是ScrollPane。滚动窗格包含一个 VBox,其中包含几个 TitledPanes,每个 TitledPanes 包含一个锚窗格,每个锚窗格都包含几个按钮。

当我试图在代码中使用modSelectorScene.lookup()和每个按钮的fx:id将按钮分配给按钮对象时,问题就开始了——每个按钮都显示为null。我发现我可以给ScrollPane分配一个fx:id并查找它,但除此之外什么也做不了。如果我将ScrollPane包装在一个AnchorPane中,并将其中一个按钮移动到AnchorPane中,我就可以用lookup方法正常地得到它。

所以我现在正在考虑的解决方案包括交替调用ScrollPane上的getContent()和getKids()以及其中的所有内容,以挖掘我的方式并以这种方式获取我的按钮。这很有效,但不是很…优雅。所以我想知道为什么Button和所有其他元素在ScrollPane后面时对查找方法是不可见的,以及是否有任何方法可以解决这个问题。

这里有一个例子:

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

例如,尝试将 EventHandler 添加到 modStr 会抛出 NullPointerException,但 ScrollPane 会按预期分配。即使是直接在其中的 VBox 也会在查找时返回 null。


共2个答案

匿名用户

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

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

匿名用户

尝试在< code >查找之前使用< code>getContent()(...):

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