我做了一个自定义的JComboBox。为此,我正在使用包含JPopupMenuJCheckBoxMenuItem。但是很显然,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());
     }
  });
}

10-07 20:12