2010-03-28 59 views
1

大家好我有在JCheckBox的監聽器添加的JOptionPane一些困難JOptionPane的出現在所選JCheckBox的


public void itemStateChanged(ItemEvent evt) { 

      if(evt.getStateChange() == ItemEvent.SELECTED){ 
        ///some code 

         JOptionPane.showMessageDialog(null, "Message", "Alert", 
           JOptionPane.INFORMATION_MESSAGE); 
      } 
    }

所以它工作正常,但問題是,對JCheckBox被選中,並立即取消哪能設法解決這個問題?

乾杯

+1

我很想知道「某些代碼」的作用。你確定你不是在重新改變複選框的狀態嗎? – 2010-03-28 13:16:18

+1

這就是爲什麼SSCCE:http://sscce.org應該在每個問題上發佈,所以我們不必猜測「某些代碼」在做什麼。 – camickr 2010-03-28 15:42:18

回答

2

這裏有兩個建議(解決方案)使用動作偵聽器而不是項目偵聽器。這確實奏效,但是,我覺得奇怪,因爲我所提供的所有文本都提供了一個項目偵聽器,這是一個複選框的預期偵聽器類型。

事實上,這是一個已知的錯誤,由Oracle Bug ID:6924233承認JOptionPane顯然會導致生成另一個事件。

建議的修復方法是使用invokeLater調用JOptionPane。這工作正常,並且只涉及對已經使用項目偵聽器用於其他目的的程序的較小代碼更改。

+0

你是對的請發佈這一個答案我的問題http://stackoverflow.com/questions/8282488/where-is-lost-setselected-from-jcheckbox,因爲這個職位可能會再次關閉+1 – mKorbel 2011-11-28 06:37:54

2

的問題必須在「///一些代碼」爲下面的測試程序對我的作品在Java中6:

public class CheckBoxItemListener { 
    public static void main(String[] args) { 
     final JCheckBox checkBox = new JCheckBox("Click me"); 

     JFrame frame = new JFrame("CheckBox Item Listener"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setBounds(100, 100, 300, 300); 
     frame.add(checkBox); 
     frame.setVisible(true); 

     checkBox.addItemListener(new ItemListener() { 
      @Override 
      public void itemStateChanged(ItemEvent evt) { 
       if (evt.getStateChange() == ItemEvent.SELECTED){ 
        JOptionPane.showMessageDialog(null, "Message", "Alert", 
          JOptionPane.INFORMATION_MESSAGE); 
       } 
      } 
     }); 
    } 
} 

有在的setSelected或省略代碼看看doClick呼叫。

+0

嗯,它接縫問題不在代碼中,我測試了我的代碼在我的Linux上,它的工作原理,但我正在虛擬機Windows XP上開發應用程序,它接縫這是問題。我不知道爲什麼,但在我的XP下,代碼是選擇複選框並取消選擇它。有誰知道爲什麼? – greenLizard 2010-03-29 12:30:35