5

FXMLoaderおかげでロードされたシーンでVBoxノードを見つけたいのです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。ルックアップメソッドがaSplitPaneSkin$Contentを返し、?を返さないのはなぜVBoxですか?
2.VBox別の方法でを取得するにはどうすればよいですか?

前もって感謝します

4

2 に答える 2

10

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();
于 2012-09-08T11:52:29.433 に答える
7
  1. 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 !!!"));
    
  2. コントローラを使用して、自動入力フィールドを追加できます。

    @FXML
    VBox myvbox;
    
于 2012-09-07T21:16:57.567 に答える