我可以在TreeItem而不是JavaFX中的TreeView上添加上下文菜单吗?

维卡斯·沙玛(Vikas Sharma)

我是JavaFX的新手。我使用以下参考资料制作了自定义TreeCell:-

http://fxexperience.com/2012/05/listview-custom-cell-factories-and-context-menus/

它对我来说非常有效。但是我的情况是我不想将此上下文菜单应用于子节点。在开始时只有一个TreeItem,而在以后的阶段这些TreeItem具有子对象,因此尝试检查isLeaf()方法没有任何意义,因为在开始时TreeItem在叶级别,但是后来成为父级。

所以任何想法我怎么能做到这一点。

非常感谢。

更新:
在我的项目的初始阶段,有三个孩子的树(邮件服务提供商),如下所示:

--- Gmail  
---雅虎  
---雷迪夫  

在我连接这些提供程序之后,它们将具有以下结构:-

邮箱
   | ____收件箱
   | ____已发送
雅虎
   | ___收件箱
   | ___已发送
   | ___草稿
雷迪夫
   | ___收件箱

现在,我只需要上下文菜单仅在Gmail,Yahoo和rediff上,而不在收件箱或已发送项目上。

我知道setContextmenu()方法,但是它可用于TreeView而不可用于TreeItem。

布莱恩

我将使您的树项目成为TreeItem的后代类,public class ProviderTreeItem extends TreeItem并为BoxBoxItem这样的框提供不同的后代。

这样,您将不会测试isLeaf,但可以测试TreeItem类型。

if (thisTreeItem.getClass() == ProviderTreeItem.class)
   thisTreeItem.setContextmenu(providerContextMenu)
else thisTreeItem.setContextmenu(boxContextMenu)

仅从子类TreeItem获取上下文菜单会更容易。

您实际上不需要子类TreeItem,只需使用名称或类似userData对象的名称来区分节点类型。如果您是子类,则可以将不同的方法和属性添加到不同的节点类型。

例如,盒子将需要一个数据结构来保存电子邮件,但是提供者不需要。提供者需要一个网址和密码等,但是框不需要。

这是更新的示例。

import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
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.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TVexample extends Application {
public abstract class AbstractTreeItem extends TreeItem{
    public abstract ContextMenu getMenu();
}

public class ProviderTreeItem extends AbstractTreeItem{
    // make class vars here like psswd
    public ProviderTreeItem(String name) {
        this.setValue(name);
    }

    @Override
    public ContextMenu getMenu(){
        MenuItem addInbox = new MenuItem("add inbox");
        addInbox.setOnAction(new EventHandler() {
            public void handle(Event t) {
                BoxTreeItem newBox = new BoxTreeItem("inbox");
                    getChildren().add(newBox);
            }
        });
        return new ContextMenu(addInbox);
    }
}

public class BoxTreeItem extends AbstractTreeItem{
    //private List<String> emails = new LinkedList<>();
    public BoxTreeItem(String name) {
        this.setValue(name);
    }

    @Override
    public ContextMenu getMenu() {
        return new ContextMenu(new MenuItem("test"));
    }
}

private 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().toString());
            setGraphic(getTreeItem().getGraphic());
            setContextMenu(((AbstractTreeItem) getTreeItem()).getMenu());
        }
    }
}

@Override
public void start(Stage primaryStage) {
    StackPane sceneRoot = new StackPane();
    TreeItem treeRoot = new TreeItem();
    treeRoot.setExpanded(true);
    ProviderTreeItem gm = new ProviderTreeItem("gmail");
    ProviderTreeItem yh = new ProviderTreeItem("yahoo");
    treeRoot.getChildren().addAll(gm,yh);
    TreeView<String> treeView = new TreeView<String>(treeRoot);
    treeView.setShowRoot(false);
    treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
        @Override
        public TreeCell<String> call(TreeView<String> p) {
            return new TreeCellImpl();
        }
    });
    sceneRoot.getChildren().add(treeView);
    Scene scene = new Scene(sceneRoot, 300, 500);


    primaryStage.setScene(scene);
    primaryStage.show();
}

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以在上下文菜单中添加“新建->空白文档”选项吗?

来自分类Dev

如何在“ gframe”中添加上下文菜单?

来自分类Dev

我可以从自定义类(不是活动类)中为上下文菜单充气吗?

来自分类Dev

我可以在没有管理员权限的Windows 7的上下文菜单中添加条目吗

来自分类Dev

我可以右键单击添加密钥以访问Firefox上下文菜单吗?

来自分类Dev

我们可以在不显示在层次结构窗口的上下文菜单中的游戏对象菜单中添加菜单项吗?

来自分类Dev

在非持久背景脚本上添加上下文菜单项?

来自分类Dev

如何在Windows 10 UWP的ListView Item上添加上下文菜单?

来自分类Dev

我可以以编程方式关闭jsTree中的上下文菜单吗?

来自分类Dev

右键单击添加上下文菜单。

来自分类Dev

VSTO-Outlook添加上下文菜单

来自分类Dev

向Inno设置页面添加上下文菜单

来自分类Dev

右键单击添加上下文菜单。

来自分类Dev

如何在甘特图中添加上下文菜单

来自分类Dev

如何为 Nat 表添加上下文菜单?

来自分类Dev

在Atom.io中添加上下文菜单命令

来自分类Dev

如何在Chrome的多功能框(地址栏)中添加上下文菜单?

来自分类Dev

如何添加上下文菜单选项以在DSL工具中布置图表?

来自分类Dev

如何在devtools>网络面板中添加上下文菜单项?

来自分类Dev

在datagrid中添加上下文菜单,如何获取select Item值

来自分类Dev

如何在Chrome的多功能框(地址栏)中添加上下文菜单?

来自分类Dev

在C#中的运行时期间添加上下文菜单栏

来自分类Dev

如何在devtools>网络面板中添加上下文菜单项?

来自分类Dev

在Windows中,通常如何为文件添加上下文菜单项?

来自分类Dev

在Nautilus por pdf文件中添加上下文菜单选项

来自分类Dev

在 Kendo for Angular 中向对话框添加上下文菜单

来自分类Dev

我可以在Snowflake中编辑会话上下文吗?

来自分类Dev

将上下文菜单添加到TreeView WPF中的叶节点

来自分类Dev

如何在TreeView中的项目上处理上下文菜单命令

Related 相关文章

  1. 1

    我可以在上下文菜单中添加“新建->空白文档”选项吗?

  2. 2

    如何在“ gframe”中添加上下文菜单?

  3. 3

    我可以从自定义类(不是活动类)中为上下文菜单充气吗?

  4. 4

    我可以在没有管理员权限的Windows 7的上下文菜单中添加条目吗

  5. 5

    我可以右键单击添加密钥以访问Firefox上下文菜单吗?

  6. 6

    我们可以在不显示在层次结构窗口的上下文菜单中的游戏对象菜单中添加菜单项吗?

  7. 7

    在非持久背景脚本上添加上下文菜单项?

  8. 8

    如何在Windows 10 UWP的ListView Item上添加上下文菜单?

  9. 9

    我可以以编程方式关闭jsTree中的上下文菜单吗?

  10. 10

    右键单击添加上下文菜单。

  11. 11

    VSTO-Outlook添加上下文菜单

  12. 12

    向Inno设置页面添加上下文菜单

  13. 13

    右键单击添加上下文菜单。

  14. 14

    如何在甘特图中添加上下文菜单

  15. 15

    如何为 Nat 表添加上下文菜单?

  16. 16

    在Atom.io中添加上下文菜单命令

  17. 17

    如何在Chrome的多功能框(地址栏)中添加上下文菜单?

  18. 18

    如何添加上下文菜单选项以在DSL工具中布置图表?

  19. 19

    如何在devtools>网络面板中添加上下文菜单项?

  20. 20

    在datagrid中添加上下文菜单,如何获取select Item值

  21. 21

    如何在Chrome的多功能框(地址栏)中添加上下文菜单?

  22. 22

    在C#中的运行时期间添加上下文菜单栏

  23. 23

    如何在devtools>网络面板中添加上下文菜单项?

  24. 24

    在Windows中,通常如何为文件添加上下文菜单项?

  25. 25

    在Nautilus por pdf文件中添加上下文菜单选项

  26. 26

    在 Kendo for Angular 中向对话框添加上下文菜单

  27. 27

    我可以在Snowflake中编辑会话上下文吗?

  28. 28

    将上下文菜单添加到TreeView WPF中的叶节点

  29. 29

    如何在TreeView中的项目上处理上下文菜单命令

热门标签

归档