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
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 件のコメント:
コメントを投稿