現在、JavaFXを使用してアプリを作成しているのですが、動的にノード(コンポーネント)を削除や追加する必要が出てきました。
しかし、ルートノードから下位ノードに向かってノードを辿っていく情報がほとんど無く、試行錯誤した方法を記載します。(ひとまず、調べたコンポーネントのみ記します)
環境
OS : macOS X Catalina
統合開発環境 : Eclipse 2019-12
Java : AdoptOpenJDK 11.0.5
JavaFX : 11.0.2
SceneBuilder : 11.0
1: AnchorPane ←ルートノード ①
2: ┣━━━ MenuBar
3: ┣━┳━ AnchorPane ②
4: ┃ ┗━┳━ SplitPane ←Horizontal(左右分割) ③
5: ┃ ┣━━━ AnchorPane
6: ┃ ┗━━━ PieChart ④
7: ┗━━━ AnchorPane
① ⇢ ② ⇢ ③ ⇢ ④ の順にノードを辿っていきます。
1: public Scene setPieChart(Stage stage) {
2: Scene scene = stage.getScene();
3: AnchorPane ap2 = (AnchorPane)this.scene.getRoot(); ①
4: AnchorPane ap3 = (AnchorPane)ap2.getChildren().get(1); ②
5: SplitPane spHorizontal = (SplitPane)ap3.getChildren().get(0); ③
6: ObservableList<?> ol = (ObservableList<?>) spHorizontal.getItems(); ③
7: PieChart pieChart = (PieChart)ol.get(1); ④
8:
9: return scene;
10: }
注意点として、SplitPaneの子ノードを取得しようとした場合、5行目のようにgetItems()
でObservableList<?>型のオブジェクト
を取得します。
この例で言うと、ObservableList<?>型のオブジェクト
の中には0番目の要素にNodeTreeの②のAnchorPane
、1番目の要素にPieChart
がセットされています。なので、sample.javaの7行目でol.get(1)しているのはそのためです。
あともうひとつ、これは動作上の注意点なのですが、PieChartの親ノードをAnchorPaneなどのコンテナにすると、描画したグラフがウィンドウのリサイズに合わせて拡大縮小されなくなります。そのため、SplitPaneの直下にPieChartを配置しています。
他に引っかかりそうなところとしてはScrollPane
があります。
具体的に、ScrollPaneの子ノードがAnchorPaneとするとAnchorPaneの取得方法は以下のようになります。
1: AnchorPane anchorPane = (AnchorPane) scrollPane.contentProperty().get();
とりあえず調べたところはここまでです。
また、開発しているときに調べる必要が出てきた場合には追記していこうと思います。
自分の備忘録も兼ねてですが、皆さんのお役に立てば幸いです。