2011-09-01 8 views
3

버튼을 누를 때 나타나는 팝업 메뉴처럼 응용 프로그램에서 멋진 메뉴처럼 작동하는 JWindow를 작성했습니다. 그러나 사용자가 주 창의 아무 곳이나 클릭하면 사라지길 바랍니다. 물론 주 윈도우에 마우스 수신기를 추가 할 수는 있지만 창 자체의 모든 구성 요소에 추가하지는 않으며 모든 구성 요소를 루핑하는 것은 약간의 무차별 솔루션처럼 보입니다. 창에있는 구성 요소가 바뀌면 제대로 작동합니다.)마우스의 아무 곳이나 클릭 감지

이와 비슷한 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+1

는 [어디 인 JPanel에/마우스 입력 종료 이벤트를 검출]이 게시물을 참조하시기 바랍니다 (http://stackoverflow.com/questions/2445297/detecting-mouse-enter-exit-events -anywhere-on-jpanel) –

답변

5

Toolkit.getDefaultToolkit().addAWTEventListener(listener, eventMask)을 사용해보세요. 마우스 클릭 만 필터링하는 eventMask를 찾습니다. 이 AWT 리스너는 전체 응용 프로그램에 대한 전역이므로 발생하는 모든 이벤트를 볼 수 있습니다.

+0

감사합니다.이 트릭을 멋지게 수행했습니다. – berry120

+1

+1 보안 제한 환경에서 작동하지 않을 수도 있습니다. – kleopatra

+0

@kleopatra, 당신은 절대적으로 옳습니다 (+1). 권한은'addAWTEventListener()'에서 검사됩니다. 그래서, 이것이 한계입니다. – AlexR

3

나는 사용자가 메인 화면의 아무 곳이나 클릭하면 그 아이에

자식 창에 WindowListener를 추가 한 후 windowDeactiveated() 이벤트를 처리하고 호출 (거짓)로 setVisible를 사라지게하고 싶습니다 창문.

근무 예 :

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

public class DialogDeactivated 
{ 
    public static void main(String[] args) 
    { 
     final WindowListener wl = new WindowAdapter() 
     { 
      public void windowDeactivated(WindowEvent e) 
      { 
       e.getWindow().setVisible(false); 
      } 
     }; 

     JButton button = new JButton("Show Popup"); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       JButton button = (JButton)e.getSource(); 
       JFrame frame = (JFrame) SwingUtilities.windowForComponent(button); 

       JDialog dialog = new JDialog(frame, false); 
       dialog.setUndecorated(true); 
       dialog.add(new JButton("Dummy Button")); 
       dialog.pack(); 
       dialog.setLocationRelativeTo(frame); 
       dialog.setVisible(true); 
       dialog.addWindowListener(wl); 
      } 
     }); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(button, BorderLayout.NORTH); 
     frame.setSize(400, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

가장 간단한 방법처럼 보였으므로 처음 시도했지만,'windowDeactiveated()'이벤트는 조금 이상하게 보였던 적이 없었습니다. 'JFrame'으로 잘 작동했지만'JWindow'로 전환하자마자. 왜 이런 일이 일어 났는지 당신이 생각하지 못했습니까? 지금 다른 방법으로 해봤지만 흥미가 있습니다. – berry120

+0

@ berry120, 확실하지는 않지만 JWindow 대신 장식되지 않은 JDialog를 사용해보십시오. 또는 당신의 질문이 진부한 메뉴를 사용하고 있다고 말할 때 왜 JPopupMenu를 사용하지 않고 왜이 동작을 기본적으로 얻지 못합니까? – camickr

+0

정확히 메뉴와 같지 않습니다. 메뉴를 클릭하면 메뉴와 대화 상자의 교차점과 같이 더 이상 원하지 않는 항목을 클릭 할 때와 같은 다양한 측면이 있습니다! 설명하기는 어렵지만 문맥에서 잘 작동합니다. 사용하지 않은 JDialog를 사용해 보았지만 작동하지 않았습니다. 아 글쎄, 나는 단지 awtevent 접근법을 고수 할 것 같아. 통찰력을 가져 주셔서 감사합니다. 작동한다면 깨끗한 해결책이었을 것입니다! – berry120

관련 문제