Почему setSelected on JCheckBox теряет эффект?

Может кто-нибудь объяснить мне, почему я потерял выбор (установленный setSelected() ) для JCheckBox когда я помещал JOptionPane в ItemListener ? Это ошибка?

Любопытно, что если этот процесс задерживается с помощью invokeLater() , setSelected() работает корректно, как я ожидал.

введите описание изображения здесьвведите описание изображения здесь

от 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(); } }); } } 

Это известная ошибка, подтвержденная Oracle Bug ID: 6924233 JOptionPane видимому, вызывает другое событие, которое генерируется с помощью флажка value = false.

Рекомендуемое исправление заключается в создании экземпляра JOptionPane с помощью 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) 

В Mac OS X и Ubuntu я не вижу никакой разницы: начиная с состояния DESELECTED , я нажимаю на этот флажок. Я вижу, что галочка появляется немедленно, а затем панель параметров. Я получаю тот же результат с Runnable или без него.

В Windows результат такой же, как описано, но я вижу крошечное мерцание галочки, когда панель параметров выходит на передний план. Эффект легче увидеть в эмуляторе, таком как VirtualBox , что может замедлить работу. Очередь Runnable восстанавливает нормальную работу.

  • Печать большого компонента Swing
  • Почему JScrollPane в JOptionPane не показывает весь его контент?
  • Java - глобальный диалог многоразового загрузки
  • Javafx: Разница между javafx.concurent и Platform.runLater?
  • Как изменить цвет конкретных слов в JTextPane?
  • Java - заполнитель в текстовом поле
  • Как изменить форму вкладки JTabbedPane?
  • Проблема с отображением графического интерфейса AbstractTableModel
  • Таблица сортировки неверна при нажатии кнопки сортировки более одного раза?
  • Как подключить одну панель к другой
  • Настройка фоновых изображений в JFrame
  • Давайте будем гением компьютера.