JavaFXでツリービューを作成・イベントを登録する方法について記載します。
目次
ツリービューを作成・イベントを登録する方法
ツリービューを作成するには、TreeViewクラス と TreeItemクラス を組み合わせて使用します。
TreeViewクラス:TreeViewを管理するクラス
TreeItemクラス:TreeViewに表示する1つ1つのアイテムを表すクラス
手順としては次のような流れになります。
① TreeViewに表示するアイテムをTreeItemとして作成します。
② ①で作成したTreeItemをTreeViewに加えます。
1. 基本的なツリービューの作成
次の例では、3階層のTreeViewを作成します。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage pStage) throws Exception { /* TreeItem(ルート) */ TreeItem<String> rootItem = new TreeItem<>("メイン"); /* TreeItem(サブ1) */ TreeItem<String> subItem1 = new TreeItem<>("サブ1"); rootItem.getChildren().add(subItem1); // ルートにサブ1を追加 /* TreeItem(サブ1の子ノード) */ TreeItem<String> subItem1A = new TreeItem<>("サブ1ーA"); TreeItem<String> subItem1B = new TreeItem<>("サブ1ーB"); TreeItem<String> subItem1C = new TreeItem<>("サブ1ーC"); subItem1.getChildren().addAll(subItem1A, subItem1B, subItem1C); // サブ1にA〜Cを追加 /* TreeItem(サブ2) */ TreeItem<String> subItem2 = new TreeItem<>("サブ2"); rootItem.getChildren().add(subItem2); // ルートにサブ2を追加 TreeItem<String> subItem2A = new TreeItem<>("サブ2ーA"); TreeItem<String> subItem2B = new TreeItem<>("サブ2ーB"); subItem2.getChildren().addAll(subItem2A,subItem2B); // サブ2にA、Bを追加 /* TreeView に 上記で作成したTreeItemを設定 */ TreeView<String> treeView = new TreeView<String>(rootItem); treeView.setPrefHeight(250); /* 配置 */ VBox root = new VBox(); root.getChildren().addAll(treeView); pStage.setTitle("TreeView"); pStage.setWidth(400); pStage.setHeight(300); pStage.setScene(new Scene(root)); pStage.show(); } public static void main(String[] args){ Application.launch(args); } } |
2. リストを開いた状態で表示する
先ほどの例では、起動時にリストは閉じていました。
TreeItemクラスのsetExpandedメソッドを使用すると起動時からリストを展開した状態で表示することが出来ます。
構文
treeitem.setExpanded(true);
※ 引数に true を指定すると展開した状態になります。
※ 引数に true を指定すると展開した状態になります。
次の例では、サブ1のすべてのアイテムを展開した状態で表示します。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage pStage) throws Exception { /* TreeItem(ルート) */ TreeItem<String> rootItem = new TreeItem<>("メイン"); rootItem.setExpanded(true); // 開いた状態にする /* TreeItem(サブ1) */ TreeItem<String> subItem1 = new TreeItem<>("サブ1"); subItem1.setExpanded(true); // 開いた状態にする rootItem.getChildren().add(subItem1); // サブ1をノートに追加 /* TreeItem(サブ1の子ノード) */ TreeItem<String> subItem1A = new TreeItem<>("サブ1ーA"); TreeItem<String> subItem1B = new TreeItem<>("サブ1ーB"); TreeItem<String> subItem1C = new TreeItem<>("サブ1ーC"); subItem1.getChildren().addAll(subItem1A, subItem1B, subItem1C); /* TreeItem(サブ2) */ TreeItem<String> subItem2 = new TreeItem<>("サブ2"); rootItem.getChildren().add(subItem2); TreeItem<String> subItem2A = new TreeItem<>("サブ2ーA"); TreeItem<String> subItem2B = new TreeItem<>("サブ2ーB"); subItem2.getChildren().addAll(subItem2A,subItem2B); /* TreeView に 上記で作成したTreeItemを設定 */ TreeView<String> treeView = new TreeView<String>(rootItem); treeView.setPrefHeight(250); /* 配置 */ VBox root = new VBox(); root.getChildren().addAll(treeView); pStage.setTitle("TreeView"); pStage.setWidth(400); pStage.setHeight(300); pStage.setScene(new Scene(root)); pStage.show(); } public static void main(String[] args){ Application.launch(args); } } |
3. ツリービューにイベントを登録する
イベントの登録には、TreeViewクラス の setOnMouseClickedメソッドを使用します。
次の例では、ツリービューにイベントを登録して、選択されたアイテム名を画面下部のラベルに表示します。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class createTreeView3 extends Application { @Override public void start(Stage pStage) throws Exception { Label lblMsg = new Label(); lblMsg.setPrefHeight(50); /* TreeItem(ルート) */ TreeItem<String> rootItem = new TreeItem<>("メイン"); /* TreeItem(サブ1) */ TreeItem<String> subItem1 = new TreeItem<>("サブ1"); rootItem.getChildren().add(subItem1); // サブ1をノートに追加 /* TreeItem(サブ1の子ノード) */ TreeItem<String> subItem1A = new TreeItem<>("サブ1ーA"); TreeItem<String> subItem1B = new TreeItem<>("サブ1ーB"); TreeItem<String> subItem1C = new TreeItem<>("サブ1ーC"); subItem1.getChildren().addAll(subItem1A, subItem1B, subItem1C); /* TreeItem(サブ2) */ TreeItem<String> subItem2 = new TreeItem<>("サブ2"); rootItem.getChildren().add(subItem2); TreeItem<String> subItem2A = new TreeItem<>("サブ2ーA"); TreeItem<String> subItem2B = new TreeItem<>("サブ2ーB"); subItem2.getChildren().addAll(subItem2A,subItem2B); /* TreeView に 上記で作成したTreeItemを設定 */ TreeView<String> treeView = new TreeView<String>(rootItem); treeView.setPrefHeight(250); /* TreeView にイベントを登録 */ treeView.setOnMouseClicked(event ->{ TreeItem<String> selectedItem = treeView.getSelectionModel().selectedItemProperty().get(); if(selectedItem != null) { lblMsg.setText("選択されたアイテム:" + selectedItem.getValue()); } }); /* 配置 */ VBox root = new VBox(); root.getChildren().addAll(treeView, lblMsg); pStage.setTitle("TreeView"); pStage.setWidth(400); pStage.setHeight(300); pStage.setScene(new Scene(root)); pStage.show(); } public static void main(String[] args){ Application.launch(args); } } |
4. 複数のアイテムを選択可能にする
ツリービューの複数アイテムを選択可能にするには、setSelectionModeメソッドで、SelectionMode.MULTIPLE を指定します。
次の例では、複数選択したアイテム名を画面下部のラベルに表示します。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import javafx.application.Application; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.SelectionMode; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage pStage) throws Exception { Label lblMsg = new Label(); lblMsg.setPrefHeight(50); /* TreeItem(ルート) */ TreeItem<String> rootItem = new TreeItem<>("メイン"); /* TreeItem(サブ1) */ TreeItem<String> subItem1 = new TreeItem<>("サブ1"); rootItem.getChildren().add(subItem1); // サブ1をノートに追加 /* TreeItem(サブ1の子ノード) */ TreeItem<String> subItem1A = new TreeItem<>("サブ1ーA"); TreeItem<String> subItem1B = new TreeItem<>("サブ1ーB"); TreeItem<String> subItem1C = new TreeItem<>("サブ1ーC"); subItem1.getChildren().addAll(subItem1A, subItem1B, subItem1C); /* TreeItem(サブ2) */ TreeItem<String> subItem2 = new TreeItem<>("サブ2"); rootItem.getChildren().add(subItem2); TreeItem<String> subItem2A = new TreeItem<>("サブ2ーA"); TreeItem<String> subItem2B = new TreeItem<>("サブ2ーB"); subItem2.getChildren().addAll(subItem2A,subItem2B); /* TreeView に 上記で作成したTreeItemを設定 */ TreeView<String> treeView = new TreeView<String>(rootItem); treeView.setPrefHeight(250); treeView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); // 複数選択可能にする /* TreeView にイベントを登録 */ treeView.setOnMouseClicked(event ->{ // 選択されたアイテムのリストを取得 ObservableList<TreeItem<String>> selectedItems = treeView.getSelectionModel().getSelectedItems(); String msg = ""; for( TreeItem<String> item : selectedItems ) { if(msg.length() != 0) { msg += ","; } msg += item.getValue(); } lblMsg.setText("選択されたアイテム:" + msg); }); /* 配置 */ VBox root = new VBox(); root.getChildren().addAll(treeView, lblMsg); pStage.setTitle("TreeView"); pStage.setWidth(400); pStage.setHeight(300); pStage.setScene(new Scene(root)); pStage.show(); } public static void main(String[] args){ Application.launch(args); } } |