我想顯示彈出框在右鍵單擊JTree
節點只,而不是整個JTree
組件。 當用戶右鍵單擊JTree節點時彈出框出現。如果他右擊JTree
中的空白區域,則不應該出現。那麼爲什麼我只能檢測到JTree
節點的鼠標事件。我在網上搜索過很多次,但找不到解決方案,請幫助我。顯示彈出框右鍵單擊JTree節點擺動
感謝。
我想顯示彈出框在右鍵單擊JTree
節點只,而不是整個JTree
組件。 當用戶右鍵單擊JTree節點時彈出框出現。如果他右擊JTree
中的空白區域,則不應該出現。那麼爲什麼我只能檢測到JTree
節點的鼠標事件。我在網上搜索過很多次,但找不到解決方案,請幫助我。顯示彈出框右鍵單擊JTree節點擺動
感謝。
這裏有一個簡單的方法:
public static void main (String[] args)
{
JFrame frame = new JFrame();
final JTree tree = new JTree();
tree.addMouseListener (new MouseAdapter()
{
public void mousePressed (MouseEvent e)
{
if (SwingUtilities.isRightMouseButton (e))
{
TreePath path = tree.getPathForLocation (e.getX(), e.getY());
Rectangle pathBounds = tree.getUI().getPathBounds (tree, path);
if (pathBounds != null && pathBounds.contains (e.getX(), e.getY()))
{
JPopupMenu menu = new JPopupMenu();
menu.add (new JMenuItem ("Test"));
menu.show (tree, pathBounds.x, pathBounds.y + pathBounds.height);
}
}
}
});
frame.add (tree);
frame.pack();
frame.setLocationRelativeTo (null);
frame.setVisible (true);
}
只是因爲我最近偶然發現了這一點,我認爲這是比現有的答案更容易一點點:
public static void main(String[] args) {
JFrame frame = new JFrame();
final JTree tree = new JTree();
JPopupMenu menu = new JPopupMenu();
menu.add(new JMenuItem("Test"));
tree.setComponentPopupMenu(menu);
frame.add(tree);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
它肯定比較容易,但我記得在某些特定的Swing組件上遇到了一些問題。另外,您無法控制此菜單的顯示方式,位置和時間 - 您只能修改菜單的內容。在你的例子中顯示菜單的代碼隱藏在L&F實現中(甚至不是組件本身或它的UI),它會默認檢查'event.isPopupTrigger()',除了其他可能的問題,在某些系統上不起作用。 – 2015-10-07 10:37:31
我不是一個Swing-pro,我只是認爲簡單的解決方案不應該保密,如果它在大多數情況下工作...感謝指出問題 – 2015-10-07 15:37:50
這是更好地使用' MouseEvent#isPopupTrigger',然後是'isRightMouseButton'方法。 – Robin 2012-04-11 08:15:46
這實際上取決於情況。但是對於默認的彈出菜單是的,它更好。 – 2012-04-11 08:20:25
+1,希望我對'JTree' :-)有很多瞭解。對我來說這是一個很好的答案:-) – 2012-04-11 13:36:14