2012-12-01 17 views
5

Mam program java, który otwiera menu podręczne po kliknięciu prawym przyciskiem myszy w JPanel. Po kliknięciu dowolnego z elementów menu podręcznego chcę wydrukować lokalizację prawego kliknięcia, które uruchomiło menu popup w terminalu. Jak mam to zrobic? Jak uzyskać lokalizację, w której nastąpiło kliknięcie prawym przyciskiem myszy w ramach wydarzeń związanych z wyskakującymi okienkami?kliknięcie prawym przyciskiem myszy lokalizacji zdarzenia akcji popmenu

Jak zmienia się kod, jeśli menu podręczne jest w części składowej JComponent?

Oto program.

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

Odpowiedz

4

Dodaj słuchacza myszy wciśnięty zdarzenia, (kliknęli zdarzenia uzyskać przechwycone przez popup):

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

wydrukować wymiar:

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

Dziękuję Garrett. – user1868856

3

jesteś na dobrej drodze. Osobiście preferuję pokazywanie go ręcznie w MouseAdapter, więc mogę dodać metody na innych mouseevents. za to prawdopodobnie trzeba usunąć 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

Dziękuję Schippi. – user1868856

+0

Uwaga: należy używać 'isPopupTrigger' zamiast ślepo w" mouseClicked "- patrz [Jak utworzyć menu kontekstowe z prawym przyciskiem myszy w Java Swing?] (Http://stackoverflow.com/a/767254/16673) – Suma

+0

Możesz zastąpić 'arg0.getButton() == MouseEvent.BUTTON3' za pomocą' SwingUtilities.isRightMouseButton (arg0) '. Nie musisz więc pamiętać numerów przycisków. –

0

Oto kod, którego szukałem. Dziękuję Schippi i Garret za pomoc.

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

Lub jeśli nie chcesz go pobrać z wydarzenia.

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 
Powiązane problemy