JavaFX の TreeView のツリー項目を右クリックすると、ポップアップ・メニュー (ContextMenu) が表示されるサンプルを、二回に亘って紹介します。今回は ListView で紹介した方法 [1] と同じです。なお、今回紹介するサンプルでは、[2] のサイトで掲載されている素材を 32 x 32 に縮小して利用させていただきました。
動作環境は次の通りです。
- OS: Fedora 23 (x86_64)
- Java: jdk1.8.0_74-1.8.0_74-fcs.x86_64 (Oracle)
- IDE: NetBeans IDE 8.1
リスト:Sample_TreeView.java
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 77 78 79 80 81 82 | package sample_treeview; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.scene.Scene; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class Sample_TreeView extends Application { Image CAROT = new Image(getClass().getResource( "carot.png" ).toString()); Image EGGPLANT = new Image(getClass().getResource( "eggplant.png" ).toString()); Image TOMATO = new Image(getClass().getResource( "tomato.png" ).toString()); Image APPLE = new Image(getClass().getResource( "apple.png" ).toString()); Image GRAPE = new Image(getClass().getResource( "grape.png" ).toString()); Image BANANA = new Image(getClass().getResource( "banana.png" ).toString()); @Override public void start(Stage primaryStage) { TreeItem<String> top = new TreeItem<>( "root" ); TreeItem<String> nodeItemA = new TreeItem<>( "野菜" ); addNode(top, nodeItemA); nodeItemA.setExpanded( true ); TreeItem<String> nodeItemB = new TreeItem<>( "果物" ); addNode(top, nodeItemB); nodeItemB.setExpanded( true ); TreeItem<String> nodeItemA1 = new TreeItem<>( "にんじん" , new ImageView(CAROT)); addNode(nodeItemA, nodeItemA1); TreeItem<String> nodeItemA2 = new TreeItem<>( "なす" , new ImageView(EGGPLANT)); addNode(nodeItemA, nodeItemA2); TreeItem<String> nodeItemA3 = new TreeItem<>( "とまと" , new ImageView(TOMATO)); addNode(nodeItemA, nodeItemA3); TreeItem<String> nodeItemB1 = new TreeItem<>( "りんご" , new ImageView(APPLE)); addNode(nodeItemB, nodeItemB1); TreeItem<String> nodeItemB2 = new TreeItem<>( "ぶどう" , new ImageView(GRAPE)); addNode(nodeItemB, nodeItemB2); TreeItem<String> nodeItemB3 = new TreeItem<>( "ばなな" , new ImageView(BANANA)); addNode(nodeItemB, nodeItemB3); ContextMenu popup = new ContextMenu(); TreeView<String> tree = new TreeView<>(top); tree.setShowRoot( false ); tree.setContextMenu(popup); createPopupMenu(popup, tree); StackPane root = new StackPane(); root.getChildren().add(tree); Scene scene = new Scene(root, 200 , 300 ); primaryStage.setTitle(getClass().getSimpleName()); primaryStage.setScene(scene); primaryStage.show(); } void addNode(TreeItem<String> parent, TreeItem<String> child) { parent.getChildren().add(child); } void createPopupMenu(ContextMenu menu, TreeView tree) { MenuItem item = new MenuItem( "処理" ); item.setOnAction((ActionEvent t) -> { TreeItem selItem = (TreeItem) tree.getSelectionModel().getSelectedItem(); System.out.println( "「" + selItem.getValue() + "」が選択されました。" ); }); menu.getItems().add(item); } public static void main(String[] args) { launch(args); } } |
実行例を以下に示します。
「野菜」が選択されました。 「にんじん」が選択されました。 「果物」が選択されました。 「なす」が選択されました。 「ぶどう」が選択されました。
問題点
ListView の項目に対しては、同一のポップアップ・メニューを表示させることができれば用が足りましたが、TreeView の場合は事情が少し違います。もちろん、今回紹介したようなポップアップメニューで十分な場合もあるのかもしれませんが、大抵の場合、各ノード(項目)の階層(レベル)によって、ポップアップ・メニューの表示内容を変えたり、あるいはレベルごとに表示/非表示を変えたい場合が多いのではないでしょうか。
次回は、TreeItem に ContextMenu を関連付けてポップアップ・メニューを表示させるサンプルを紹介する予定です。
参考サイト
0 件のコメント:
コメントを投稿