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