1

我有这个问题。在自定义 JTree 中,我实现了一个 JPopupMenu 以根据使用 MouseListener 选择的节点显示不同的 JMenuItem。单击鼠标右键时会显示 JPopupMenu。问题是,如果我不从 PopupMenu 中选择一个项目,而是选择树中的另一个节点,无论是使用右按钮还是左按钮,此事件都不会被树捕获 MouseListener 有人能指出我正确的方向吗?解决这个?如果有可用的示例,我将不胜感激。谢谢。

4

1 回答 1

1

我建议也许使用 TreeSelectionListener 来确定所选节点的变化,而不是 MouseListener 并在那时重新填充 JPopupMenu,但这是您的选择。

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

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

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);
            }
        });
    }
}
于 2010-07-28T19:02:00.867 回答