2012-04-11 1 views
3

Я хочу показать всплывающее окно правой кнопкой мыши по адресу JTree только для узла, а не для всего компонента JTree. Когда пользователь щелкает правой кнопкой мыши на узле JTree, появляется всплывающее окно. Если он щелкнет правой кнопкой мыши пробел в JTree, тогда он не должен появляться. Поэтому для этого, как я могу обнаружить событие мыши только для узла JTree. Я много раз искал сеть, но не мог найти решение, поэтому, пожалуйста, помогите мне.показ всплывающего окна на правый клик на узле JTree swing

Спасибо.

ответ

13

Вот простой способ:

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); 
} 
+0

Это лучше использовать ' MouseEvent # isPopupTrigger', а затем метод isRightMouseButton. – Robin

+0

Это действительно зависит от ситуации. Но для всплывающих меню по умолчанию да, это лучше. –

+0

+1, жаль, что я так много знал о 'JTree' :-). Для меня это хороший ответ :-) –

2

Просто потому, что я наткнулся на это в последнее время, и я думаю, что это немного легче, чем существующий ответ:

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); 
} 
+1

Это определенно проще, но я помню, что у него были некоторые проблемы с некоторыми компонентами Swing. Кроме того, у вас нет контроля над тем, как, где и когда отображается это меню, вы можете изменять содержимое меню. Код, отображающий меню в вашем примере, скрыт глубоко в реализации L & F (даже не сам компонент или его пользовательский интерфейс), и по умолчанию проверяет 'event.isPopupTrigger()', который, среди других возможных проблем, не работает в некоторых системах. –

+0

Я не так сильно разбираюсь в Swing-pro, я просто подумал, что простое решение не должно храниться в секрете, если оно работает в большинстве случаев ... Спасибо, что указали на проблемы –