首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaFX 2.0 + FXML -奇怪的查找行为

JavaFX 2.0 + FXML -奇怪的查找行为
EN

Stack Overflow用户
提问于 2012-09-07 20:16:43
回答 2查看 7.4K关注 0票数 5

我想要在带有FXMLoader的场景中找到一个FXMLoader节点,这要感谢Node#lookup(),但是我得到了以下例外:

java.lang.ClassCastException: com.sun.javafx.scene.control.skin.SplitPaneSkin$Content cannot be cast to javafx.scene.layout.VBox

代码:

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
<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

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-07 21:16:57

  1. SplitPane将所有项放置在单独的堆栈窗格中(如SplitPaneSkin$Content)。由于未知的原因,FXMLLoader为它们分配了与根子用户相同的id。您可以通过下一个实用程序方法获得所需的VBox: 公共T查找(节点父、字符串id、类clazz) { for (节点节点: parent.lookupAll( id )) { if (node.getClass().isAssignableFrom(clazz)) {返回(T)节点;}抛出新的IllegalArgumentException(“父”+父+“不包含带有id”+id的节点); 然后用下一个方法: VBox myvbox =查找(页面,"#myvbox",VBox.class);myvbox.getChildren().add(新按钮(“Hello!!”));
  2. 您可以使用控制器并添加自动操作字段: @FXML VBox myvbox;
票数 7
EN

Stack Overflow用户

发布于 2012-09-08 11:52:29

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

代码语言:javascript
运行
复制
VBox myvbox = (VBox)fxmlLoader.getNamespace().get("myvbox");

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

代码语言:javascript
运行
复制
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("test.fxml"));
AnchorPane page = (AnchorPane) fxmlLoader.load();
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12324799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档