package
sample_treeview2;
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.TreeCell;
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
static
javafx.application.Application.launch;
public
class
Sample_TreeView2
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"
);
TreeBranch<String> nodeItemA =
new
TreeBranch<>(
"野菜"
);
addNode(top, nodeItemA);
nodeItemA.setExpanded(
true
);
TreeBranch<String> nodeItemB =
new
TreeBranch<>(
"果物"
);
addNode(top, nodeItemB);
nodeItemB.setExpanded(
true
);
TreeLeaf<String> nodeItemA1 =
new
TreeLeaf<>(
"にんじん"
,
new
ImageView(CAROT));
addNode(nodeItemA, nodeItemA1);
TreeLeaf<String> nodeItemA2 =
new
TreeLeaf<>(
"なす"
,
new
ImageView(EGGPLANT));
addNode(nodeItemA, nodeItemA2);
TreeLeaf<String> nodeItemA3 =
new
TreeLeaf<>(
"とまと"
,
new
ImageView(TOMATO));
addNode(nodeItemA, nodeItemA3);
TreeLeaf<String> nodeItemB1 =
new
TreeLeaf<>(
"りんご"
,
new
ImageView(APPLE));
addNode(nodeItemB, nodeItemB1);
TreeLeaf<String> nodeItemB2 =
new
TreeLeaf<>(
"ぶどう"
,
new
ImageView(GRAPE));
addNode(nodeItemB, nodeItemB2);
TreeLeaf<String> nodeItemB3 =
new
TreeLeaf<>(
"ばなな"
,
new
ImageView(BANANA));
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
addNode(TreeItem<String> parent, TreeItem<String> child) {
parent.getChildren().add(child);
}
class
TreeBranch<T>
extends
TreeItem<T> {
public
TreeBranch(
final
T value) {
super
(value);
}
public
TreeBranch(
final
T value,
final
Node graphic) {
super
(value, graphic);
}
public
ContextMenu getMenu() {
return
null
;
}
}
class
TreeLeaf<T>
extends
TreeBranch<T> {
public
TreeLeaf(
final
T value) {
super
(value);
}
public
TreeLeaf(
final
T value,
final
Node graphic) {
super
(value, graphic);
}
@Override
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
TreeCell<String> {
@Override
public
void
updateItem(String item,
boolean
empty) {
super
.updateItem(item, empty);
if
(empty) {
setText(
null
);
setGraphic(
null
);
}
else
{
setText(getItem() ==
null
?
""
: getItem());
setGraphic(getTreeItem().getGraphic());
setContextMenu(((TreeBranch) getTreeItem()).getMenu());
}
}
}
public
static
void
main(String[] args) {
launch(args);
}
}