¿Por qué setSelected en JCheckBox pierde efecto?

¿Puede alguien explicarme por qué perdí la selección (establecida por setSelected() ) para JCheckBox cuando puse el JOptionPane en el ItemListener ? ¿Es esto un error?

Es curioso que si este proceso se retrasa con invokeLater() , setSelected() funciona correctamente como esperaba.

enter image description hereenter image description here

de SSCCE

 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ComponentEventDemo extends JPanel implements ComponentListener, ItemListener { private static final long serialVersionUID = 1L; private JFrame frame; private JTextArea display; private String newline = "\n"; private JTextField field1; public ComponentEventDemo() { super(new BorderLayout()); display = new JTextArea(10, 25); display.setEditable(false); JPanel panel = new JPanel(new GridLayout(0, 2)); field1 = new JTextField(); field1.setDisabledTextColor(Color.red); JCheckBox checkbox = new JCheckBox("Label visible", true); checkbox.addItemListener(this); panel.add(checkbox); panel.add(field1); panel.addComponentListener(this); JScrollPane scrollPane = new JScrollPane(display); frame = new JFrame("ComponentEventDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(scrollPane, BorderLayout.CENTER); frame.add(panel, BorderLayout.SOUTH); frame.addComponentListener(this); frame.setLocation(200, 200); frame.pack(); frame.setVisible(true); } public void itemStateChanged(ItemEvent evt) { System.out.println("STATE CHANGED!"); if (evt.getStateChange() == ItemEvent.SELECTED) { //javax.swing.SwingUtilities.invokeLater(new Runnable() { //public void run() { int returnVal = JOptionPane.showConfirmDialog(display, "Bla Bla Bla Text"); if (returnVal == JOptionPane.OK_OPTION) { field1.setText("SELECTED - OK btn"); } else if (returnVal == JOptionPane.NO_OPTION) { field1.setText("SELECTED - NO btn"); } else if (returnVal == JOptionPane.CANCEL_OPTION) { field1.setText("SELECTED - Cancel btn"); } else if (returnVal == JOptionPane.CLOSED_OPTION) { field1.setText("SELECTED - Close btn"); } //} //}); } else if (evt.getStateChange() == ItemEvent.DESELECTED) { field1.setText("DESELECTED"); } } protected void displayMessage(String message) { display.append(message + newline); display.setCaretPosition(display.getDocument().getLength()); } public void componentHidden(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " ---> Hidden"); } public void componentMoved(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " ---> Moved"); } public void componentResized(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " ---> Resized "); } public void componentShown(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " ---> Shown"); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { ComponentEventDemo ced = new ComponentEventDemo(); } }); } } 

Es un error conocido como reconocido por Oracle Bug ID: 6924233 El JOptionPane aparentemente causa que se genere otro evento con un valor de checkbox = falso.

La solución recomendada es crear una instancia de JOptionPane utilizando invokeLater .

 Submitted On 09-MAR-2010 The change is in the BasicButtonListener - Method focusLost() In 1.6.0_18 it is ... ButtonModel model = b.getModel(); model.setPressed(false); model.setArmed(false); in 1.6.0_10 it was ... ButtonModel model = b.getModel(); model.setArmed(false); model.setPressed(false); (The order of the statements changed) And a setPressed(false) with armed==true leads on an ToggleButton like the JCheckBox to a change of the selection (see ToggleButtonModel) 

En Mac OS X y Ubuntu no veo ninguna diferencia: comenzando desde el estado DESELECTED , hago clic en la checkbox. Veo que la marca de verificación aparece inmediatamente, seguido por el panel de opciones. Obtengo el mismo resultado con Runnable o sin Runnable .

En Windows, el resultado es el descrito, pero veo un pequeño parpadeo de la marca de verificación cuando el panel de opciones aparece en primer plano. El efecto es más fácil de ver en un emulador, como VirtualBox , que puede ralentizar las cosas. Runnable the Runnable restaura el funcionamiento normal.