Java JTree中的jpopmpmenu问题

Java JTree中的jpopmpmenu问题,java,swing,jtree,jpopupmenu,Java,Swing,Jtree,Jpopupmenu,我有这个问题。在一个定制的JTree中,我实现了一个JPOpupMenus,根据使用鼠标侦听器选择的节点显示不同的JMenuItem。 单击鼠标右键时,将显示JPOPUP菜单。问题是,如果我没有从弹出菜单中选择一个项目,而是选择树中的另一个节点(使用右键或左键),则树鼠标侦听器永远不会捕获此事件 有人能给我指出解决这个问题的正确方向吗?如果有一个例子,我将不胜感激。 谢谢 我建议使用TreeSelectionListener来确定所选节点中的更改,而不是鼠标侦听器,并在此时重新填充JPOppMe

我有这个问题。在一个定制的JTree中,我实现了一个JPOpupMenus,根据使用鼠标侦听器选择的节点显示不同的JMenuItem。 单击鼠标右键时,将显示JPOPUP菜单。问题是,如果我没有从弹出菜单中选择一个项目,而是选择树中的另一个节点(使用右键或左键),则树鼠标侦听器永远不会捕获此事件 有人能给我指出解决这个问题的正确方向吗?如果有一个例子,我将不胜感激。
谢谢

我建议使用TreeSelectionListener来确定所选节点中的更改,而不是鼠标侦听器,并在此时重新填充JPOppMenu,但这是您的选择

试图模仿您的示例,我想知道,您在鼠标侦听器中覆盖了哪些方法?在这个简单的示例中,无论弹出菜单是否显示,侦听器似乎都会获取事件

编辑-请参阅下面的我的评论,但右键单击不选择节点是默认行为。此示例将选择距离右键单击最近的节点(如果可能)

public class SampleTree extends JFrame {
    private JPopupMenu menu = new JPopupMenu("Popup");

    public SampleTree() throws HeadlessException {
        super("Tree");
        final JTree tree = new JTree();

        tree.addMouseListener(new MouseAdapter() {
           public void mouseReleased(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    TreePath tp = tree.getClosestPathForLocation(e.getX(),e.getY());
                    if (tp != null) {
                        System.out.println(tp);
                        tree.setSelectionPath(tp);
                    }
                    menu.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        });

        String letters = "ABCDEF";

        for (final char letter : letters.toCharArray()) {
            JMenuItem item = new JMenuItem(String.valueOf(letter));
            item.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(SampleTree.this, "You chose the letter: " + letter);
                }
            });
            menu.add(item);
        }

        add(new JScrollPane(tree));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                SampleTree st = new SampleTree();
                st.setSize(200, 200);
                st.setLocationRelativeTo(null);
                st.setVisible(true);
            }
        });
    }
}

我建议使用TreeSelectionListener来确定所选节点中的更改,而不是MouseListener,并在此时重新填充JPOppMenu,但这是您的选择

试图模仿您的示例,我想知道,您在鼠标侦听器中覆盖了哪些方法?在这个简单的示例中,无论弹出菜单是否显示,侦听器似乎都会获取事件

编辑-请参阅下面的我的评论,但右键单击不选择节点是默认行为。此示例将选择距离右键单击最近的节点(如果可能)

public class SampleTree extends JFrame {
    private JPopupMenu menu = new JPopupMenu("Popup");

    public SampleTree() throws HeadlessException {
        super("Tree");
        final JTree tree = new JTree();

        tree.addMouseListener(new MouseAdapter() {
           public void mouseReleased(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    TreePath tp = tree.getClosestPathForLocation(e.getX(),e.getY());
                    if (tp != null) {
                        System.out.println(tp);
                        tree.setSelectionPath(tp);
                    }
                    menu.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        });

        String letters = "ABCDEF";

        for (final char letter : letters.toCharArray()) {
            JMenuItem item = new JMenuItem(String.valueOf(letter));
            item.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(SampleTree.this, "You chose the letter: " + letter);
                }
            });
            menu.add(item);
        }

        add(new JScrollPane(tree));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                SampleTree st = new SampleTree();
                st.setSize(200, 200);
                st.setLocationRelativeTo(null);
                st.setVisible(true);
            }
        });
    }
}

感谢您重播您的建议,我可以告诉您,我已开始评估TreeSelectionListener,但TreeSelectionEvent无法确定按下了哪个鼠标按钮。关于您的示例,与我的示例非常相似,我们都覆盖了MouseReleased和MousePressed方法,尽管在您的示例中,左按钮的行为与预期的一样,右按钮仍然如我所述,如果弹出菜单仍然可见,MousePressed和MouseSeclicked不会接收事件。如果您找到了解决方案,请重新发布。根据以下错误报告,我相信这是JTree的默认行为:。我修改了我的示例,以演示如何通过鼠标右键单击选择节点以编程方式执行此操作。感谢您重播您的建议,我可以看出我已开始评估TreeSelectionListener,但TreeSelectionEvent无法确定按下了哪个鼠标按钮。关于您的示例,与我的示例非常相似,我们都覆盖了MouseReleased和MousePressed方法,尽管在您的示例中,左按钮的行为与预期的一样,右按钮仍然如我所述,如果弹出菜单仍然可见,MousePressed和MouseSeclicked不会接收事件。如果您找到了解决方案,请重新发布。根据以下错误报告,我相信这是JTree的默认行为:。我修改了我的示例,以演示如何通过鼠标右键单击选择节点以编程方式执行此操作。无法复制(使用jdk6u27):mouseEvents到达树上安装的侦听器,与弹出窗口是否可见无关。因此,可能是core中的一个bug现在已经修复,或者是代码中的一个bug没有显示:-)无法复制(使用jdk6u27):mouseEvents到达树上安装的侦听器,与弹出窗口是否可见无关。所以可能是内核中的一个bug现在已经修复了,或者是代码中的一个bug没有显示:-)