JavaFX の TreeView にポップアップ・メニュー (ContextMenu) を表示するサンプルを以前紹介しましたが [1]、さらにチェックボックスをつける用途が出てきたので、まずは前述のサンプルをベースにテストをしました。まだ無駄が残っていますが、当初予定していた機能を実装できましたので紹介します。更に検討を加えた結果、補足・修正を加えるかもしれませんが、あらかじめご了承ください。
実行例
今回のサンプルは少々ソースが長くなるため、最初に実行例を示します。
にんじんのチェックボックスが 'false' から 'true' に変更されました。 なすのチェックボックスが 'false' から 'true' に変更されました。 とまとのチェックボックスが 'false' から 'true' に変更されました。 「とまと」が選択されました。
ソース
動作環境は次の通りです。
- OS: Fedora 23 (x86_64)
- Java: jdk1.8.0_77-1.8.0_77-fcs.x86_64 (Oracle)
- IDE: NetBeans IDE 8.1
リスト:Sample_TreeView3.java
package sample_treeview3;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Node;
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;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.CheckBoxTreeItem;
import javafx.scene.control.cell.CheckBoxTreeCell;
import static javafx.application.Application.launch;
public class Sample_TreeView3 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());
TreeView<String> tree;
@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);
TreeLeaf<String> nodeItemA1 = new TreeLeaf<>("にんじん", new ImageView(CAROT));
TreeLeafListener(nodeItemA1);
addNode(nodeItemA, nodeItemA1);
TreeLeaf<String> nodeItemA2 = new TreeLeaf<>("なす", new ImageView(EGGPLANT));
TreeLeafListener(nodeItemA2);
addNode(nodeItemA, nodeItemA2);
TreeLeaf<String> nodeItemA3 = new TreeLeaf<>("とまと", new ImageView(TOMATO));
TreeLeafListener(nodeItemA3);
addNode(nodeItemA, nodeItemA3);
TreeLeaf<String> nodeItemB1 = new TreeLeaf<>("りんご", new ImageView(APPLE));
TreeLeafListener(nodeItemB1);
addNode(nodeItemB, nodeItemB1);
TreeLeaf<String> nodeItemB2 = new TreeLeaf<>("ぶどう", new ImageView(GRAPE));
TreeLeafListener(nodeItemB2);
addNode(nodeItemB, nodeItemB2);
TreeLeaf<String> nodeItemB3 = new TreeLeaf<>("ばなな", new ImageView(BANANA));
TreeLeafListener(nodeItemB3);
addNode(nodeItemB, nodeItemB3);
tree = new TreeView<>(top);
tree.setShowRoot(false);
tree.setCellFactory((TreeView<String> p) -> new TreeCellImpl());
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 TreeLeafListener(TreeLeaf<String> item) {
item.selectedProperty().addListener((ObservableValue<? extends Boolean> obs, Boolean oldVal, Boolean newVal) -> {
System.out.println(item.getValue() + "のチェックボックスが '" + oldVal + "' から '" + newVal + "' に変更されました。");
});
}
void addNode(TreeItem<String> parent, TreeItem<String> child) {
parent.getChildren().add(child);
}
class TreeLeaf<T> extends CheckBoxTreeItem<T> {
public TreeLeaf(final T value) {
super(value);
}
public TreeLeaf(final T value, final Node graphic) {
super(value, graphic);
}
public ContextMenu getMenu() {
ContextMenu popup = new ContextMenu();
MenuItem menuItem = new MenuItem("処理");
menuItem.setOnAction((ActionEvent event) -> {
TreeItem selItem = tree.getSelectionModel().getSelectedItem();
System.out.println("「" + selItem.getValue() + "」が選択されました。");
});
popup.getItems().add(menuItem);
return popup;
}
}
public final class TreeCellImpl extends CheckBoxTreeCell<String> {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else if (getTreeItem().getClass().toString().endsWith("TreeLeaf")) {
setContextMenu(((TreeLeaf) getTreeItem()).getMenu());
} else {
setText(getItem() == null ? "" : getItem());
setGraphic(getTreeItem().getGraphic());
}
}
}
public static void main(String[] args) {
launch(args);
}
}
参考サイト
にほんブログ村



0 件のコメント:
コメントを投稿