2012-12-01 5 views
5

JPanel에서 마우스 오른쪽 버튼을 클릭했을 때 팝업 메뉴가 열리는 Java 프로그램이 있습니다. 팝업 메뉴 항목 중 하나를 클릭하면, 터미널의 팝업 메뉴를 트리거 한 오른쪽 클릭의 위치를 ​​인쇄하고 싶습니다. 어떻게해야합니까? 팝업 액션 이벤트 내에서 마우스 오른쪽 버튼 클릭이 발생한 위치를 어떻게 알 수 있습니까?popmenu 액션 이벤트에서 오른쪽 클릭 위치 얻기

팝업 메뉴가 JComponent에있을 경우 코드가 어떻게 변경됩니까?

다음은 프로그램입니다.

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

답변

4

누르면 이벤트에 마우스 리스너를 추가, 제거 할 필요가

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

개럿 감사합니다. – user1868856

3

올바른 길을 가고있었습니다. 개인적으로 수동으로 MouseAdapter에 표시하는 것을 선호하므로 다른 mouseevents에 메서드를 추가 할 수 있습니다.

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

인쇄 밖으로에게 차원을 : 이것을 위해 당신은 아마 (클릭 이벤트가 팝업에 의해 캡처받을)을 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

감사합니다. – user1868856

+0

참고 : 'mouseClicked'에서 맹목적으로 수행하는 것이 아니라'isPopupTrigger'를 사용해야합니다. [Java Swing에서 마우스 오른쪽 버튼으로 컨텍스트 메뉴를 만들려면 어떻게해야합니까?] (http://stackoverflow.com/a/767254/16673)를 참조하십시오.) – Suma

+0

'arg0.getButton() == MouseEvent.BUTTON3'을'SwingUtilities.isRightMouseButton (arg0)'으로 대체 할 수 있습니다. 따라서 버튼 번호를 기억할 필요가 없습니다. –

0

내가 찾고있는 코드는 다음과 같습니다. 도와 주신 Schippi와 Garret 씨께 감사드립니다.

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

또는 이벤트에서 가져 오지 않으려는 경우.

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 
관련 문제