我有以下自定义TreeView代码:
treeView.setCellFactory(new Callback<TreeView<Tree>, TreeCell<Tree>>()
{
@Override
public TreeCell<Tree> call(TreeView<Tree> treeView)
{
final TreeCell<Tree> cell = new TreeCell<Tree>()
{
@Override
protected void updateItem(Tree item, boolean empty)
{
super.updateItem(item, empty);
if (!empty)
{
setText(item != null ? item.toString() : "");
setGraphic(createImageView(item));
setContextMenu(createContextMenuTreeItem(item));
}
else
{
setText(null);
setGraphic(null);
setContextMenu(null);
}
}
};
return cell;
}
});
我希望能够使用“内容菜单”重命名树的节点。你能帮我实现这个吗?
您可以简单地在MenuItem的EventHandler中开始对树节点的编辑。这是一个示例代码,该代码允许通过双击(我没有尝试更改/阻止它)以及从上下文菜单进行基本编辑:
import javafx.application.Application;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.TextFieldTreeCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.*;
import javafx.util.converter.DefaultStringConverter;
public class TreeViewSample extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Tree View Sample");
TreeItem<String> rootItem = new TreeItem<String> ("Tree");
rootItem.setExpanded(true);
for (int i = 1; i < 6; i++) {
TreeItem<String> item = new TreeItem<String> ("Item" + i);
rootItem.getChildren().add(item);
}
TreeView<String> tree = new TreeView<String> (rootItem);
tree.setEditable(true);
tree.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
@Override
public TreeCell<String> call(TreeView<String> p) {
return new RenameMenuTreeCell();
}
});
StackPane root = new StackPane();
root.getChildren().add(tree);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
private static class RenameMenuTreeCell extends TextFieldTreeCell<String> {
private ContextMenu menu = new ContextMenu();
public RenameMenuTreeCell() {
super(new DefaultStringConverter());
MenuItem renameItem = new MenuItem("Rename");
menu.getItems().add(renameItem);
renameItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
startEdit();
}
});
}
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!isEditing()) {
setContextMenu(menu);
}
}
}
}
这基本上是Oracle的带有自定义树单元的示例13-1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句