0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaFXでルートノードから下位ノードに向かって辿る 〜道順は知ってるんだけど〜

Last updated at Posted at 2020-01-03

現在、JavaFXを使用してアプリを作成しているのですが、動的にノード(コンポーネント)を削除や追加する必要が出てきました。
しかし、ルートノードから下位ノードに向かってノードを辿っていく情報がほとんど無く、試行錯誤した方法を記載します。(ひとまず、調べたコンポーネントのみ記します)

環境
OS : macOS X Catalina
統合開発環境 : Eclipse 2019-12
Java : AdoptOpenJDK 11.0.5
JavaFX : 11.0.2
SceneBuilder : 11.0

NodeTree
1: AnchorPane ←ルートノード ①
2: ┣━━━ MenuBar
3: ┣━┳━ AnchorPane ②
4: ┃ ┗━┳━ SplitPane ←Horizontal(左右分割) ③
5: ┃   ┣━━━ AnchorPane
6: ┃   ┗━━━ PieChart ④
7: ┗━━━ AnchorPane

① ⇢ ② ⇢ ③ ⇢ ④ の順にノードを辿っていきます。

sample.java
 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の取得方法は以下のようになります。

sample2.java
 1:	AnchorPane anchorPane = (AnchorPane) scrollPane.contentProperty().get();

とりあえず調べたところはここまでです。
また、開発しているときに調べる必要が出てきた場合には追記していこうと思います。

自分の備忘録も兼ねてですが、皆さんのお役に立てば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?