【问题标题】:Add JPopup menu by right clicking on node in Swing in Java通过在 Java 中的 Swing 中右键单击节点来添加 JPopup 菜单
【发布时间】:2011-06-22 07:19:24
【问题描述】:

在 GUI 中,我在 JPanel 的左侧显示了一个 JTree。现在对于每个Node(leaf),鼠标右键单击我想显示JPopup 菜单,要求在右侧JPanel 中显示有关Node 的统计信息。

由于我是摇摆新手,任何人都可以帮助编写代码。 提前致谢。

问候, 图沙尔·多迪亚。

【问题讨论】:

  • 我修改了你的帖子,如果不是请回复...

标签: java swing jpanel jtree jpopupmenu


【解决方案1】:

使用JTree的方法

public TreePath getPathForLocation(int x, int y)

然后是树路径

public Object getLastPathComponent()

这会从用户右键单击的位置返回您想要的节点。

【讨论】:

  • 这是关于如何将 JPopup 的 MouseListener 添加到 JTree
  • 我认为问题不是“如何添加弹出窗口”而是“如何根据点击的节点添加弹出窗口”
  • 我也是 :) 也许您应该提到 getTooltip(MouseEvent) 作为根据该位置的节点配置组件弹出窗口的地方
【解决方案2】:

似乎引起了一些混乱(让我自己感到困惑;-) - 所以这里有一个代码 sn-p 用于对 componentPopup 进行目标位置相关的配置

    JPopupMenu popup = new JPopupMenu();
    final Action action = new AbstractAction("empty") {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
        }
    };
    popup.add(action); 
    JTree tree = new JTree() {

        /** 
         * @inherited <p>
         */
        @Override
        public Point getPopupLocation(MouseEvent e) {
            if (e != null) {
               TreePath path = getClosestPathForLocation(e.getX(), e.getY());
               action.putValue(Action.NAME, String.valueOf(path.getLastPathComponent()));
               return e.getPoint();
            }
            action.putValue(Action.NAME, "no mouse"); 
            return null;
        }

    };
    tree.setComponentPopupMenu(popup);

【讨论】:

    【解决方案3】:

    我采用了@kleopatra 解决方案并稍作更改。 也许这不是最好的方法,但对我有用。

    JTree tree = new JTree() {
        private static final long serialVersionUID = 1L;
        @Override public Point getPopupLocation(MouseEvent e) {
            if (e == null) return new Point(0,0);
            TreePath path = getClosestPathForLocation(e.getX(), e.getY());
            Object selected = path != null ? path.getLastPathComponent() : null;
            setComponentPopupMenu(getMenuForTreeNode(getComponentPopupMenu(), selected));
            setSelectionPath(path);
            return e.getPoint();
        }
    };
    
    
    
    public JPopupMenu getMenuForTreeNode(JPopupMenu menu, Object treeNode) {
        if (menu == null) menu = new JPopupMenu("Menu:");
        menu.removeAll();
        if (treeNode instanceof MyTreeItem) {
            menu.add(new JMenuItem("This is my tree item: " + treeNode.toString()));
        }
        return menu;
    }
    

    【讨论】:

    • 更改componentPopup实例(不确定你是否这样做,只是说:-)会有点脆弱:它取决于getPopupLocation的调用代码来调用getComponentPopup after请求位置。这在 Oracle 的 BasicLookAndFeel 中是偶然发生的,其他实现可能不会
    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2010-10-20
    • 2012-09-04
    • 1970-01-01
    • 2017-08-25
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多