通过右键单击Java中Swing中的节点来添加JPopup菜单

通过右键单击Java中Swing中的节点来添加JPopup菜单,java,swing,jpanel,jtree,jpopupmenu,Java,Swing,Jpanel,Jtree,Jpopupmenu,在GUI中,我在JPanel的左侧显示一个JTree。现在,对于每个节点(叶),在鼠标右键单击时,我想显示JPopup菜单,要求在右侧JPanel中显示有关节点的统计信息 由于我是swing新手,有人能帮我编写代码吗。 提前谢谢 问候,, Tushar Dodia.使用JTree的方法 public TreePath getPathForLocation(int x, int y) 然后是树路 public Object getLastPathComponent() 从用户右键单击的点返回所

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

由于我是swing新手,有人能帮我编写代码吗。 提前谢谢

问候,, Tushar Dodia.

使用JTree的方法

public TreePath getPathForLocation(int x, int y)
然后是树路

public Object getLastPathComponent()

从用户右键单击的点返回所需的节点

似乎引起了一些混乱(让我困惑;-)-所以这里有一段代码片段,用于对组件进行与目标位置相关的配置

    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);
jpopplus popup=新建jpopplus();
最终行动行动=新的抽象行动(“空”){
@凌驾
已执行的公共无效操作(操作事件e){
//TODO自动生成的方法存根
}
};
添加(操作);
JTree树=新的JTree(){
/** 
*@遗传
*/
@凌驾
公共点getPopupLocation(MouseeEvent e){
如果(e!=null){
TreePath path=getClosestPathForLocation(e.getX(),e.getY());
action.putValue(action.NAME,String.valueOf(path.getLastPathComponent());
返回e.getPoint();
}
action.putValue(action.NAME,“无鼠标”);
返回null;
}
};
tree.setComponentPopupMenu(弹出菜单);

我服用了@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;
}

我修改了你的帖子,如果没有,请回复。这是关于如何将JPopup的MouseListener添加到JTree的问题。我想问题不是“如何添加弹出窗口”,而是“如何根据单击的节点添加弹出窗口”,我也是:)也许你应该提到getTooltip(MouseEvent)由于配置组件弹出窗口的位置取决于该位置的节点更改组件弹出窗口实例(不确定是否这样做,只说:-)会有点脆弱:请求位置后调用getComponentPopup取决于getPopupLocation的调用代码。这在Oracle的BasicLookAndFeel中是偶然发生的,其他实现可能不会