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

2019-06-27 23:52发布

我想找到装有一个场景中的垂直框节点FXMLoader感谢Node#lookup()但我得到以下异常:

java.lang.ClassCastException: com.sun.javafx.scene.control.skin.SplitPaneSkin$Content cannot be cast to 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以另一种方式?

提前致谢

Answer 1:

  1. SplitPane放入独立的堆栈窗格的所有项目(如幻想SplitPaneSkin$Content )。 对于不明原因FXMLLoader为它们分配相同的ID为root的孩子。 你可以得到垂直框,你需要在明年实用方法:

     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 !!!")); 
  2. 你可以使用控制器 ,并添加autopopulated领域:

     @FXML VBox myvbox; 


Answer 2:

获取到垂直框中的参考,最简单的方法是调用FXMLLoader#getNamespace()。 例如:

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

请注意,您需要在为了这个共同创造FXMLLoader的一个实例,并调用加载()的非静态版本:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("test.fxml"));
AnchorPane page = (AnchorPane) fxmlLoader.load();


文章来源: JavaFX 2.0 + FXML - strange lookup behaviour