我做了一个自定义的JComboBox
。为此,我正在使用包含JPopupMenu
的JCheckBoxMenuItem
。但是很显然,PopupMenuListener
popupMenuWillBecomeInvisible
在更改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) {}
}
最佳答案
一种“可能的”解决方案与冲突相比,使用您的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());
}
});
}