One "possible" solution vs. a kludge, is use your popupMenuWillBecomeInvisible(...)
but queue your checking of the state onto the Swing event queue so that it performs its action later, after all items currently on the event queue have finished. This is not guaranteed to work however.
@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());
}
});
}