Проблема с JPopupMenu в JTree - PullRequest
       14

Проблема с JPopupMenu в JTree

1 голос
/ 28 июля 2010

У меня есть эта проблема.В пользовательском JTree я реализовал JPopupMenu для отображения различных JMenuItem в соответствии с узлом, выбранным с помощью MouseListener.JPopupMenu отображается при нажатии правой кнопки мыши.Проблема заключается в том, что если я не выберу Предмет из PopupMenu, а вместо этого выберу другой узел в дереве, либо с помощью правой или левой кнопки, это событие никогда не перехватывается деревом MouseListener.решить это?В случае, если пример доступен, я буду признателен.Благодарю.

1 Ответ

1 голос
/ 28 июля 2010

Я бы предложил использовать 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);
            }
        });
    }
}
...