2013-05-21 32 views
1

我做了一个自定义JComboBox。为此,我正在使用包含JCheckBoxMenuItemJPopupMenu。但显然PopupMenuListenerpopupMenuWillBecomeInvisible正在JCheckBoxMenuItem改变之前运行。任何想法如何解决? 我不想为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

一个“可能”的解决方案与一个杂牌,是用你的popupMenuWillBecomeInvisible(...),但排队的状态检测到Swing事件队列,以便在以后执行其行动后,目前该事件队列中的所有项目都完了。但是这并不能保证能够正常工作。

@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