2013-05-21 4 views
1

사용자 정의 JComboBox을 만들었습니다. 이를 위해 JCheckBoxMenuItem을 포함하는 JPopupMenu을 사용하고 있습니다. 그러나 JCheckBoxMenuItem이 변경되기 전에 PopupMenuListenerpopupMenuWillBecomeInvisible이 실행 중입니다. 어떤 아이디어를 수정하는 방법? JCheckBoxMenuItem에 리스너를 추가하고 싶지 않습니다. 현재 이벤트 큐에있는 모든 항목이 후청취자가 조치를 취하기 전에 실행

public class ListenerTest extends JFrame implements ActionListener, PopupMenuListener { 

    private JPopupMenu menu; 
    private List<JCheckBoxMenuItem> menuItems; 

    private JCheckBoxMenuItem i1; 
    private JCheckBoxMenuItem i2; 
    private JCheckBoxMenuItem i3; 

    public ListenerTest(){ 

     // Create button 
     JButton b = new JButton("Click me!"); 
     b.addActionListener(this); 

     // Create Popupmenu 
     menu = new JPopupMenu(); 
     menu.addPopupMenuListener(this); 

     // Add CheckBoxes to PopupMenu 
     menuItems = new LinkedList<JCheckBoxMenuItem>(); 
     i1 = new JCheckBoxMenuItem("1"); 
     i2 = new JCheckBoxMenuItem("2"); 
     i3 = new JCheckBoxMenuItem("3"); 
     menu.add(i1); 
     menu.add(i2); 
     menu.add(i3); 

     this.add(b); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.pack(); 
     this.setVisible(true); 
    } 

    public static void main(String[] args){ 
     new ListenerTest(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // Show PopupMenu when button is clicked 
     menu.show(this, 0, this.getHeight()); 
    } 

    @Override 
    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} 

    @Override 
    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
     // Check which checkBoxes is checked when popup menu is closed(currently one step behind) 
     System.out.println(i1.isSelected()); 
     System.out.println(i2.isSelected()); 
     System.out.println(i3.isSelected()); 
    } 

    @Override 
    public void popupMenuCanceled(PopupMenuEvent e) {} 
} 

답변

3

kludge 대 한 "가능한"솔루션, 당신의 popupMenuWillBecomeInvisible(...)를 사용하지만 나중에 그 작업을 수행하도록 스윙 이벤트 큐에 국가의 당신의 확인을 대기한다 끝마친. 그러나 이는 보장 할 수 없습니다.

@Override 
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 

    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     System.out.println(i1.isSelected()); 
     System.out.println(i2.isSelected()); 
     System.out.println(i3.isSelected()); 
    } 
    }); 
} 
+0

Nooo! 너는 잠깐 나를 때렸다. +1 =) –

+0

고마워! 훌륭한 일을했다. – Grains

관련 문제