带有复选框和上下文菜单的 JavaFx TreeView
JavaFx TreeView with CheckBox and ContextMenu
在教程 http://docs.oracle.com/javafx/2/ui_controls/tree-view.htm 中解释了如何使用 ContextMenu 或 CheckBox 创建 TreeView。
但是有没有可能两者兼得呢?
当我第一次复制粘贴代码时,我了解到我只能有一个 setCellFactory,因为它们会相互覆盖。
// the following two setCellFactory are copied from the tutorial
// this create TreeCell with ContextMenu
treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
@Override
public TreeCell<String> call(TreeView<String> p) {
return new TextFieldTreeCellImpl();
//the class TextFieldTreeCellImp is a TreeCell with ContextMenu
}
});
// this create TreeCell with CheckBox
tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
然后我尝试用 CheckBoxTreeCell 替换 TreeCell
//class TextFieldTreeCellImpl extends TreeCell<String> {
class TextFieldTreeCellImpl extends CheckBoxTreeCell<String> {
...
//TreeItem newTag = new TreeItem<String>("New tag");
CheckBoxTreeItem newTag = new CheckBoxTreeItem<String>("New tag");
但是复选框没有出现。它仍然是一个普通的树视图。
我认为用 CheckBoxes
和 ContextMenu
获得 TreeView
的最快方法是在工厂回调中添加 ContextMenu
:
treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>() {
@Override
public TreeCell<String> call(TreeView<String> param) {
TreeCell<String> cell = CheckBoxTreeCell.<String>forTreeView().call(param);
ContextMenu menu = new ContextMenu();
MenuItem item1 = new MenuItem("Item 1");
MenuItem item2 = new MenuItem("Item 2");
EventHandler<ActionEvent> eh = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Item '" + event.getSource() +
"' of cell '" + cell + "' was clicked.");
}
};
item1.setOnAction(eh);
item2.setOnAction(eh);
menu.getItems().add(item1);
menu.getItems().add(item2);
cell.setContextMenu(menu);
return cell;
}
});
我为 CheckBoxes
调用通常的 TreeCell
工厂。但是,在返回单元格之前,我添加了 ContextMenu
.
使用 EventHandler
,您可以指定相应项目的点击行为。
如果您还有其他问题或者这不是您问题的满意解决方案,请随时与我联系。
在教程 http://docs.oracle.com/javafx/2/ui_controls/tree-view.htm 中解释了如何使用 ContextMenu 或 CheckBox 创建 TreeView。
但是有没有可能两者兼得呢?
当我第一次复制粘贴代码时,我了解到我只能有一个 setCellFactory,因为它们会相互覆盖。
// the following two setCellFactory are copied from the tutorial
// this create TreeCell with ContextMenu
treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
@Override
public TreeCell<String> call(TreeView<String> p) {
return new TextFieldTreeCellImpl();
//the class TextFieldTreeCellImp is a TreeCell with ContextMenu
}
});
// this create TreeCell with CheckBox
tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
然后我尝试用 CheckBoxTreeCell 替换 TreeCell
//class TextFieldTreeCellImpl extends TreeCell<String> {
class TextFieldTreeCellImpl extends CheckBoxTreeCell<String> {
...
//TreeItem newTag = new TreeItem<String>("New tag");
CheckBoxTreeItem newTag = new CheckBoxTreeItem<String>("New tag");
但是复选框没有出现。它仍然是一个普通的树视图。
我认为用 CheckBoxes
和 ContextMenu
获得 TreeView
的最快方法是在工厂回调中添加 ContextMenu
:
treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>() {
@Override
public TreeCell<String> call(TreeView<String> param) {
TreeCell<String> cell = CheckBoxTreeCell.<String>forTreeView().call(param);
ContextMenu menu = new ContextMenu();
MenuItem item1 = new MenuItem("Item 1");
MenuItem item2 = new MenuItem("Item 2");
EventHandler<ActionEvent> eh = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Item '" + event.getSource() +
"' of cell '" + cell + "' was clicked.");
}
};
item1.setOnAction(eh);
item2.setOnAction(eh);
menu.getItems().add(item1);
menu.getItems().add(item2);
cell.setContextMenu(menu);
return cell;
}
});
我为 CheckBoxes
调用通常的 TreeCell
工厂。但是,在返回单元格之前,我添加了 ContextMenu
.
使用 EventHandler
,您可以指定相应项目的点击行为。
如果您还有其他问题或者这不是您问题的满意解决方案,请随时与我联系。