2013-09-11 2 views
1

Я минимизировал свою программу, чтобы включить только проблему, и я попытался закодировать точно так, как я понял из многих примеров. Когда я использовал ActionListener, я решил проблему. Но мне интересно, почему использование ItemListener, флажок не работает правильно. Если я запускаю свою программу без ItemListener, она работает правильно. При этом ItemListener, checkBox не изменяет состояние.Java JCheckBox ItemListener заставляет программу работать некорректно

import java.awt.FlowLayout; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 

public class omaJFrame extends JFrame{ 
    private JCheckBox checkBox1; 

    public omaJFrame() { 
     super("Window Title"); 

     TheHandler handler = new TheHandler(); 
     setLayout(new FlowLayout()); 

     checkBox1 = new JCheckBox("Checkbox 1"); 
     add(checkBox1); 
     checkBox1.addItemListener(handler); 
    } 

    private class TheHandler implements ItemListener { 
     String output = ""; 

     public void itemStateChanged(ItemEvent event) { 
      if (event.getItem()==checkBox1) 
       output = String.format("%s", checkBox1.isSelected()); 
      JOptionPane.showMessageDialog(null, output); 
     } 
    } 
} 

import javax.swing.JFrame; 
public class EventHandlerMain { 
    public static void main(String[] args) { 
     omaJFrame window = new omaJFrame(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setSize(350,200); 
     window.setVisible(true); 
    } 
} 
+2

Я думаю, что это та же самая проблема: http://stackoverflow.com/a/8291984/655249 –

+0

возможно дубликат [JOptionPane появляться на выбранном JCheckBox] (http://stackoverflow.com/questions/ 2532941/joptionpane-to-seem-on-selected-jcheckbox) – trashgod

ответ

1

Работы для меня. Отметим также, что объекты Swing GUI должны быть сконструированы и обработаны только на event dispatch thread.

import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 

public class OmaJFrame extends JFrame { 

    private JCheckBox checkBox1; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       OmaJFrame f = new OmaJFrame(); 
      } 
     }); 
    } 

    public OmaJFrame() { 
     super("Window Title"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     TheHandler handler = new TheHandler(); 
     setLayout(new FlowLayout()); 
     checkBox1 = new JCheckBox("Checkbox 1"); 
     add(checkBox1); 
     checkBox1.addItemListener(handler); 
     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 

    private class TheHandler implements ItemListener { 

     String output = ""; 

     @Override 
     public void itemStateChanged(ItemEvent event) { 
      if (event.getItem() == checkBox1) { 
       output = String.format("%s", checkBox1.isSelected()); 
      } 
      JOptionPane.showMessageDialog(null, output); 
     } 
    } 
} 
+0

Проблема, похоже, в строю: JOptionPane.showMessage ... Если я прокомментирую это, установите флажок! –

+0

@PaulaPosio Вы также можете использовать панель параметров, если хотите, если вы ее оберните 'SwingUtilities.invokeLater()' (или 'EventQueue.invokeLater()'). – kiheru

+0

@kiheru: Это обходное решение, предложенное в id ошибки [6924233] (http://stackoverflow.com/a/8291984/655249), цитируется [здесь] (http://stackoverflow.com/a/8291984/230513). – trashgod

Смежные вопросы