2016-07-12 16 views
0

Wenn ich die JCheckBox wählen, wird es automatisch abgewählt ...JCheckBox Abwahl automatisch

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Math extends JFrame 
{ 
    private JPanel panel2 = new JPanel(); 
    private JCheckBox cb = new JCheckBox("Record Answers"); 

    //Constructor 
    public Math() 
    { 
     setSize(300,300); 
     setTitle("Math"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 

     panel2.add(cb); 

     //add ActionListners 
     cb.addItemListener(new listenerCb()); 

     add(panel2, BorderLayout.SOUTH);    
     setVisible(true); 
    } 

    //itemListner for cb 
    public class listenerCb implements ItemListener 
    { 
     public void itemStateChanged(ItemEvent e) 
     {  
      if(cb.isSelected()) 
      { 
       JOptionPane.showMessageDialog(null,"Example"); 

      } 
     } 
    } 
    public static void main(String[] args) 
    { 
     new Math(); 

    } 

} 

Jedes Mal, wenn ich versuche, cb zu wählen, es erscheint die JOPtionPane und abgewählt. wenn ich die JOptionPane entferne, funktioniert es gut.

+0

[seinem Bug in API] (http://stackoverflow.com/questions/8282488/why-does-setselected-on-jcheckbox-lose-effect) – mKorbel

Antwort

2

Ich denke, das Problem besteht darin, dass das Optionsfenster einige der Ereignisse empfängt, da es jetzt Fokus hat.

Eine Lösung besteht darin, den Code so einzubinden, dass der JOptionPane in einem SwingUtilities.invokeLater(...) angezeigt wird.

Dadurch kann das Häkchen in seinem neuen Zustand neu gezeichnet werden, bevor das Optionsfenster angezeigt wird.

public class listenerCb implements ItemListener 
{ 
    public void itemStateChanged(ItemEvent e) 
    { 
     if(cb.isSelected()) 
     { 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        JOptionPane.showMessageDialog(null,"Example"); 
       } 
      }); 
     } 
    } 
}