2012-12-01 7 views
5

Ich habe ein Java-Programm, das ein Popup-Menü öffnet, wenn Sie in einem JPanel rechts geklickt. Wenn eines der Popup-Menüelemente angeklickt wird, möchte ich den Ort der rechten Maustaste drucken, die das Popup-Menü im Terminal ausgelöst hat. Wie mache ich das? Wie erhalte ich den Ort, an dem der Rechtsklick passiert ist, innerhalb von Popup-Aktionsereignissen?bekommen Rechtsklick-Position von Popmenu Aktionsereignis

Wie ändert sich der Code, wenn sich das Popup-Menü in einer JComponent befindet?

Hier ist das Programm.

import java.awt.EventQueue; 
    import java.awt.event.*; 
    import javax.swing.*; 

    public class MenuTest 
    { 
     public static void main(String[] args) 
     { 
      EventQueue.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        MenuFrame frame = new MenuFrame(); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true); 
       } 
      }); 
     } 
    } 

    class MenuFrame extends JFrame 
    { 
     public MenuFrame() 
     { 
      setTitle("MenuTest"); 
      setSize(300, 200); 

      Action cutAction = new TestAction("Cut"); 
      Action copyAction = new TestAction("Copy"); 
      Action pasteAction = new TestAction("Paste"); 

      JPopupMenu popup = new JPopupMenu(); 
      popup.add(cutAction); 
      popup.add(copyAction); 
      popup.add(pasteAction); 

      JPanel panel = new JPanel(); 
      panel.setComponentPopupMenu(popup); 
      add(panel); 

      panel.addMouseListener(new MouseAdapter() {}); 
     } 

     class TestAction extends AbstractAction 
     { 
      public TestAction(String name) 
      { 
       super(name); 
      } 

      public void actionPerformed(ActionEvent event) 
      { 
       System.out.println("Right click happened at ?"); // How do I get right click location?   
      } 
     } 
    } 

Antwort

4

hinzufügen Maus Hörer gedrückt Ereignisse entfernen, (geklickt Ereignisse durch Pop-up gefangen genommen):

panel.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      clickLocation.setSize(e.getX(), e.getY()); 
     } 
    }); 
    Action cutAction = new TestAction("Cut", clickLocation); 
    Action copyAction = new TestAction("Copy", clickLocation); 
    Action pasteAction = new TestAction("Paste", clickLocation); 

Drucken Sie die Dimension:

private Dimension clickLocation; 

    public TestAction(String name, Dimension clickLocation) { 
     super(name); 
     this.clickLocation = clickLocation; 
    } 

    public void actionPerformed(ActionEvent event) { 
     System.out.println("Right click happened at " + clickLocation); 
    } 
+0

Danke Garrett. – user1868856

3

Sie waren auf dem richtigen Weg. Ich persönlich bevorzuge es, es manuell im MouseAdapter zu zeigen, also kann ich Methoden auf anderen mousevents hinzufügen. dafür müssen Sie wahrscheinlich die panel.setComponentPopupMenu(popup);


panel.addMouseListener(new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent arg0) { 
      if (arg0.getButton() == MouseEvent.BUTTON3) { //Button3 is rightclick 
       popup.show(panel, arg0.getX(), arg0.getY()); 
      } 
     } 
}); 
+0

Vielen Dank Schippi. – user1868856

+0

Hinweis: Man sollte 'isPopupTrigger' verwenden, anstatt es blind in' mouseClicked' zu tun - siehe [Wie erstelle ich ein Kontextmenü in Java Swing?] (Http://stackoverflow.com/a/767254/16673) – Suma

+0

Sie könnten 'arg0.getButton() == MouseEvent.BUTTON3' mit' SwingUtilities.isRightMouseButton (arg0) 'ersetzen. Sie müssen sich also nicht an die Tastennummern erinnern. –

0

Hier ist der Code, nach dem ich gesucht habe. Danke, Schippi und Garret, für deine Hilfe.

import java.awt.EventQueue; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import java.awt.geom.*; 

    public class MenuTest 
    { 
     public static void main(String[] args) 
     { 
      EventQueue.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        MenuFrame frame = new MenuFrame(); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true); 
       } 
      }); 
     } 
    } 

    class MenuFrame extends JFrame 
    { 
     public MenuFrame() 
     { 
      setTitle("MenuTest"); 
      setSize(300, 200); 

      Action cutAction = new TestAction("Cut"); 
      Action copyAction = new TestAction("Copy"); 
      Action pasteAction = new TestAction("Paste"); 

      JPopupMenu popup = new JPopupMenu(); 
      popup.add(cutAction); 
      popup.add(copyAction); 
      popup.add(pasteAction); 

      JPanel panel = new JPanel(); 
      panel.setComponentPopupMenu(popup); 
      add(panel); 

      panel.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mousePressed(MouseEvent e) { 
        clickLocation= e.getPoint(); 
       } 
      }); 
     } 

     class TestAction extends AbstractAction 
     { 
      public TestAction(String name) 
      { 
       super(name); 
      } 

      public void actionPerformed(ActionEvent event) 
      { 
       System.out.println("Right click happened at (" + clickLocation.getX()+"," + clickLocation.getY()+ ")");   
      } 
     } 

     private Point2D clickLocation; 
    } 
0

Oder wenn Sie es nicht von der Veranstaltung bekommen wollen.

Point mousepospoint=null; 

if((mousepospoint=componentname.getMousePosition()) != null){ 
//mouseposArray[0]=mousepospoint.x; 
//mouseposArray[1]=mousepospoint.y; 
mousepoints(mousepospoint.x,mousepospoint.y); 
}//enif 


int[] mouseposArray={0,0}; 
// requires a function to return it if mouseposArray[] is global 
protected int[] mousepoints(int xpo,int ypo){ 
mouseposArray=new int[2]; 
mouseposArray[0]=xpo; 
mouseposArray[1]=ypo; 
return mouseposArray; 
}//enmeth