当前位置: 首页 > 知识库问答 >
问题:

JavaFX 2.0 FXML-奇怪的查找行为

郎宏浚
2023-03-14

我想在一个场景中找到一个VBox节点加载FXMLoader感谢Node#lookup(),但我得到以下异常:

java.lang.类异常:com.sun.javafx.scene.control.skin.SplitPaneSkin$Content不能强制转换到javafx.scene.layout.VBox

守则:

public class Main extends Application {  
    public static void main(String[] args) {
        Application.launch(Main.class, (java.lang.String[]) null);
    }
    @Override
    public void start(Stage stage) throws Exception {
        AnchorPane page = (AnchorPane) FXMLLoader.load(Main.class.getResource("test.fxml"));
        Scene scene = new Scene(page);
        stage.setScene(scene);
        stage.show();

        VBox myvbox = (VBox) page.lookup("#myvbox");
        myvbox.getChildren().add(new Button("Hello world !!!"));
    }
}

fxml文件:

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" >
  <children>
    <SplitPane dividerPositions="0.5" focusTraversable="true" prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
      <items>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" />
        <VBox fx:id="myvbox" prefHeight="398.0" prefWidth="421.0" />
      </items>
    </SplitPane>
  </children>
</AnchorPane>

我想知道:
1。为什么查找方法返回的是SplitPaneSkin$Content,而不是VBox
2。如何以另一种方式获取VBox

提前谢谢

共有2个答案

洪国兴
2023-03-14

>

  • SplitPane将所有项目放在单独的堆栈窗格中(称为SplitPaneSkin$Content)。出于未知的原因,FXMLLoader将它们分配为与根子节点相同的id。您可以通过下一个实用程序方法获得您需要的VBox:

    public <T> T lookup(Node parent, String id, Class<T> clazz) {
        for (Node node : parent.lookupAll(id)) {
            if (node.getClass().isAssignableFrom(clazz)) {
                return (T)node;
            }
        }
        throw new IllegalArgumentException("Parent " + parent + " doesn't contain node with id " + id);
    }
    

    然后用下一种方法

    VBox myvbox = lookup(page, "#myvbox", VBox.class);
    myvbox.getChildren().add(new Button("Hello world !!!"));
    

    您可以使用控制器并添加自动填充字段:

    @FXML
    VBox myvbox;
    

  • 魏波娃
    2023-03-14

    获取对VBox的引用的最简单方法是调用FXMLLoader#getNamespace()。例如:

    VBox myvbox = (VBox)fxmlLoader.getNamespace().get("myvbox");
    

    请注意,您需要创建FXMLLoader的实例并调用load()的非静态版本,以使其正常工作:

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("test.fxml"));
    AnchorPane page = (AnchorPane) fxmlLoader.load();
    
     类似资料:
    • 我已经在这个问题上绞尽脑汁好几天了,我正在使用google sheets表单中的查询功能来提取数据的子集,但是查询是有效的,如果我在特定的几个字段中添加一个值,查询结果都是不可靠的(技术术语)。公式如下: 但是,如果我在P列(这些屏幕截图中的第5列)中添加另一个值,我会得到一些奇怪的行为: 数据本身是零星的,因为并非所有字段都将被填充,所以我的where子句只提取not空值。这些值也是数字和文本的

    • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

    • 问题内容: 我想在加载了感谢的场景中找到VBox节点,但出现以下异常: 代码 : fxml文件: 我想知道: 1.为什么查找方法返回a 而不是a ? 2.我怎样才能得到另一种方式? 提前致谢 问题答案: SplitPane将所有项目放在单独的堆栈窗格中(用表示)。出于未知原因,FXMLLoader为它们分配与root子代相同的ID。您可以通过下一个实用程序方法获得所需的VBox: } 并以其他方式

    • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

    • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

    • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。