2012-12-01 21 views
5

Ho un programma java che apre un menu popup quando si fa clic con il tasto destro su un JPanel. Quando si fa clic su una qualsiasi delle voci del menu popup, voglio stampare la posizione del clic destro che ha attivato il menu popup nel terminale. Come faccio a fare questo? Come posso ottenere la posizione in cui è avvenuto il clic destro all'interno degli eventi di azione popup?ottenendo la posizione clic con il pulsante destro dal popmenu action event

Come cambia il codice se il menu popup si trova in un JComponent?

Ecco il programma.

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?   
      } 
     } 
    } 

risposta

4

aggiungere un listener del mouse per eventi pressati, (eventi cliccato vengono catturati da pop-up):

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); 

Stampa fuori la dimensione:

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

Grazie Garrett. – user1868856

3

eri sulla buona strada. Personalmente preferisco mostrarlo manualmente nello MouseAdapter così posso aggiungere metodi su altri effetti del mouse. per questo probabilmente è necessario rimuovere il 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

Grazie Schippi. – user1868856

+0

Nota: si dovrebbe usare 'isPopupTrigger' piuttosto che farlo ciecamente nel' mouseClicked' - vedi [Come faccio a creare un menu di scelta rapida con clic destro in Java Swing?] (Http://stackoverflow.com/a/767254/16673) – Suma

+0

È possibile sostituire 'arg0.getButton() == MouseEvent.BUTTON3' con' SwingUtilities.isRightMouseButton (arg0) '. Quindi non devi ricordare i numeri dei pulsanti. –

0

Ecco il codice che stavo cercando. Grazie Schippi e Garret per il tuo aiuto.

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

Oppure se non si desidera ottenerlo dall'evento.

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