2010-06-14 3 views
4

JPopupMenu이 숨겨져있을 때 알림을 받고 싶습니다. 항목을 선택했거나 메뉴를 닫았거나 setVisible(false)이 (가) 호출 되었기 때문에 알려드립니다. 내 JPopupMenu에 대해 componentHidden이 호출되지 않는 이유는 무엇입니까?

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

public class A extends ComponentAdapter implements Runnable, ActionListener { 
    private JButton b; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new A()); 
    } 

    public void run() { 
     JFrame f = new JFrame("Test"); 
     b = new JButton("Click me"); 
     b.addActionListener(this); 
     f.add(b); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
     JPopupMenu pm = new JPopupMenu(); 
     pm.addComponentListener(this); 
     pm.add("Popup..."); 
     pm.add("...menu!"); 
     pm.show(b, 10, 10); 
    } 

    public void componentShown(ComponentEvent e) { System.out.println("componentShown"); } 
    public void componentHidden(ComponentEvent e) { System.out.println("componentHidden"); } 
} 

는 상관없이 나는 메뉴와 상호 작용하는 방법의 두 ComponentListener 방법 중 어느 것도

라고하고 있습니다 : 여기 내 테스트 코드입니다. 왜 그런가요? 내 JPopupMenu이 숨겨져있는 것을 발견하는 다른/더/정확한 방법이 있습니까?

감사합니다,

카메론

+2

관련 질문 (@heycam의 논의 중 일부가 유용 할 수 있음) : h ttp : //stackoverflow.com/questions/2421914/showing-hiding-a-jpopupmenu-from-a-jubutton-focuslistener-not-working – Ash

+1

@Ash에서 제시 하듯이,'PopupMenuListener'를보십시오. – trashgod

+0

우수, 애쉬와 쓰레기 고마워. 어떻게 PopupMenuListener를 간과했는지 전혀 모르겠다! ComponentListeners가 JPopupMenus에 대해 호출되지 않는다는 사실은 재미 없다. – heycam

답변

5
pm.addPopupMenuListener(new PopupMenuListener() { 

    @Override 
    public void popupMenuCanceled(PopupMenuEvent e) { 
     System.out.println("cancelled"); 
    } 

    @Override 
    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
     System.out.println("vanishing"); 
    } 

    @Override 
    public void popupMenuWillBecomeVisible(PopupMenuEvent e) { 
     System.out.println("appearing"); 
    } 
}); 

편집 : 누군가가 코멘트에 답변을 선택처럼 으악이 보인다. 내 잘못이야.

편집 2 :있는 ComponentListener 메뉴 사라지고 당신에게 이벤트를 전송되지 않는 이유에 관해서, 이것은 설명 할 수 있습니다

(가) 구성 요소 숨김 구성 요소 표시 이벤트는 결과로 발생 Component의 setVisible 메소드에의 호출의 호출. 예를 들어, 구성 요소가 숨겨진 이벤트가 발생하지 않고도 창을 아이콘으로 아이콘 화 (아이콘 화) 할 수 있습니다.

출처 : (. 아마도 비 정식하지만, 말의 입에서) :

public void setVisible(boolean b) { 
     // Not supported for MenuComponents 
    } 

그리고 당신은 어떻게 그렇게 알고있을 ComponentListener tutorial

setVisible의 JPopupMenu의 구현과 함께 것을 고려 그런데 왜 그런 일이 일어나지 않는가? (정당화는 무엇이며 제대로 문서화되어 있는가?)

+0

답변을 받았을 때 나는 그들의 의견 중 하나를 받아 들였습니다. :) JPopupMenus에 ComponentListeners가 호출되지 않은 이유를 누구나 말해 줄 수 있는지 궁금해합니다. – heycam

+0

+1 형식을 향상시킬 수 있더라도 _ 할 수 있습니다. :-) – trashgod

+0

죄송합니다, 저항 할 수 없었습니다! – trashgod

관련 문제