1

この問題があります。カスタム JTree で JPopupMenu を実装し、MouseListener を使用して選択されたノードに応じて異なる JMenuItem を表示しました。マウスの右ボタンをクリックすると JPopupMenu が表示されます。問題は、PopupMenu からアイテムを選択せず​​に、ツリー内の別のノードを右ボタンまたは左ボタンで選択した場合、このイベントがツリーによって決してキャッチされないことです。これを解決しますか?例が利用可能な場合、私はそれを感謝します。ありがとう。

4

1 に答える 1

1

MouseListenerではなく、選択したノードの変更を判別し、その時点でJPopupMenuを再設定するために、TreeSelectionListenerを使用することをお勧めしますが、それはあなたの選択です。

あなたの例をエミュレートしようとして、私はあなたがあなたのマウスリスナーでどのメソッドをオーバーライドしたのか疑問に思いましたか?この簡単な例では、ポップアップメニューが表示されているかどうかに関係なく、リスナーはイベントを取得しているように見えます。

編集-以下の私のコメントを参照してください。ただし、ノードを選択しないで右クリックすると、デフォルトの動作になります。この例では、可能であれば、右クリックが行われた場所に最も近いノードを選択します。

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 に答える