2012-04-11 14 views
3

Ich möchte Popup-Box auf einen Rechtsklick auf JTree nur Knoten zeigen, nicht für die gesamte JTree Komponente. Wenn der Benutzer mit der rechten Maustaste auf einen JTree-Knoten klickt, wird das Popup-Fenster angezeigt. Wenn er in JTree mit der rechten Maustaste auf ein Leerzeichen klickt, sollte es nicht angezeigt werden. Also wie kann ich Mausereignis nur für JTree Knoten erkennen. Ich habe viele Male über das Netz gesucht, konnte aber keine Lösung finden, also bitte hilf mir.zeigt Popup-Box auf Rechtsklick auf JTree Knoten Swing

Danke.

Antwort

13

Hier ist eine einfache Art und Weise:

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

Es ist besser, die 'zu verwenden MouseEvent # isPopupTrigger' dann die 'isRightMouseButton' Methode. – Robin

+0

Das hängt tatsächlich von der Situation ab. Aber für die Standard-Popup-Menüs ja, es ist besser. –

+0

+1, wünschte, ich wüsste so viel über 'JTree' :-). Für mich ist es eine nette Antwort :-) –

2

Nur weil ich vor kurzem auf diesem gestolpert und ich denke, es ist ein wenig einfacher als die bestehende Antwort:

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

Es ist definitiv einfacher, aber ich erinnere mich daran, einige Probleme mit bestimmten Swing-Komponenten zu haben. Außerdem haben Sie keine Kontrolle darüber, wie, wo und wann dieses Menü angezeigt wird - Sie können nur den Inhalt des Menüs ändern. Der Code, der das Menü in Ihrem Beispiel anzeigt, ist tief in der L & F-Implementierung versteckt (nicht einmal die Komponente selbst oder seine Benutzeroberfläche) und prüft standardmäßig 'event.isPopupTrigger() ', was unter anderen möglichen Problemen auf einigen Systemen nicht funktioniert. –

+0

Ich bin nicht so sehr ein Swing-Profi, ich dachte nur, die einfache Lösung sollte nicht geheim gehalten werden, wenn es in den meisten Fällen funktioniert ... Danke, dass du auf die Probleme aufmerksam gemacht hast –

Verwandte Themen