2011-04-27 25 views
7

Tengo una casilla de verificación que, cuando el usuario la selecciona, debe generar un cuadro de diálogo con más información, y ante la reacción del usuario, haga algo. Mi código es básicamente lo siguiente:JCheckbox cambia de estado dos veces cuando muestro un cuadro de diálogo en statechange, ¿cómo solucionarlo?

private void onItemStateChanged(java.awt.event.ItemEvent evt) { 
    System.out.println("STATE CHANGED!");//TODO debug code 
    if (evt.getStateChange() == ItemEvent.SELECTED) { 
     int returnVal = JOptionPane.showConfirmDialog(this, "blablatext"); 
     if (returnVal == JOptionPane.OK_OPTION) { 
      this.field1TF.setText(""); 
      this.field1TF.setEditable(false); 
      this.field2TF.setText(""); 
      this.filed2TF.setEditable(false); 
     }else if(returnVal == JOptionPane.NO_OPTION){ 
      this.field1TF.setText(""); 
      this.field1TF.setEditable(false); 
      this.field2TF.setText(""); 
      this.field2TF.setEditable(false); 
     } 
    } else if(evt.getStateChange() == ItemEvent.DESELECTED){ 
     this.field1TF.setEditable(true); 
     this.field2TF.setEditable(true); 
    } 
} 

Mi problema ahora es, que mi casilla cambia de estado siempre dos veces cuando hago clic en él. De alguna manera tiene que ver con JOptionPane.showConfirmDialog porque si lo comento, funciona como se esperaba. ¿No conozco algo simple que debería preocuparme aquí, o qué debo hacer para obtener la reacción deseada? (El usuario hace clic casilla -> se hace una pregunta -> elige SI/NO/Cancelar -> programa actúa en consecuencia)

Respuesta

6
+0

Mientras funciona así (con una variable global para el estado de la casilla de verificación) pensé un controlador para hacer las cosas en itemStateChanged era exactamente lo que necesitaba. ¿Sabes por qué no funciona con eso? Le daré la 'respuesta aceptada' si nadie más viene con una solución al problema original, ya que esta es una solución válida para mí. –

+0

ok, compruebe http://download.oracle.com/javase/tutorial/uiswing/events/itemlistener.html que contiene un exaple con similar outPut y le enviaré un ejemplo sobre ActionListener – mKorbel

+3

No tengo ningún problema para escribir el Listener , Tengo el problema de que el estado de la casilla de verificación cambia dos veces seguidas, lo que de alguna manera debe tener su origen en JOptionpane.showDialog ... Sí, lo hago. Agradezco tu ayuda, y por ahora usé ActionListener, pero la idea de esta publicación era obtener algunas pistas sobre por qué el cuadro de diálogo que engendré provoca que la casilla se vuelva a marcar –

1

eeerggrrhh , tiene que mirar ItemListener, y al usar esta demostración ....

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

/** @see http://stackoverflow.com/questions/5806712 */ 
public class ComponentEventDemo extends JPanel 
    implements ActionListener, ComponentListener, ItemListener { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame; 
    private JTextArea display; 
    private JLabel label; 
    private String newline = "\n"; 
    private JTextField field1TF; 
    private JTextField field2TF; 
    private JCheckBox checkbox; 

    public ComponentEventDemo() { 
     super(new BorderLayout()); 
     display = new JTextArea(); 
     display.setEditable(false); 
     JPanel panel = new JPanel(new GridLayout(0, 4)); 
     field1TF = new JTextField(); 
     field1TF.setDisabledTextColor(Color.red); 
     field2TF = new JTextField(); 
     field2TF.setDisabledTextColor(Color.red); 
     label = new JLabel("This is a label", JLabel.CENTER); 
     label.addComponentListener(this); 
     checkbox = new JCheckBox("Label visible", true); 
     checkbox.addActionListener(this); 
     checkbox.addComponentListener(this); 
     checkbox.addItemListener(this); 
     panel.add(checkbox); 
     panel.add(label); 
     panel.add(field1TF); 
     panel.add(field2TF); 
     panel.addComponentListener(this); 
     JScrollPane scrollPane = new JScrollPane(display); 
     scrollPane.setPreferredSize(new Dimension(650, 200)); 
     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!");//TODO debug code 
     if (evt.getStateChange() == ItemEvent.SELECTED) { 
      int returnVal = JOptionPane.showConfirmDialog(frame, "blablatext"); 
      if (returnVal == 0) { 
       field1TF.setText("SELECTED - OK btn"); 
       field1TF.setEditable(false); 
       field2TF.setText("SELECTED - OK btn"); 
       field2TF.setEditable(false); 
      } else if (returnVal == 1) { 
       field1TF.setText("SELECTED - canc btn"); 
       field1TF.setEditable(true); 
       field2TF.setText("SELECTED - canc btn"); 
       field2TF.setEditable(true); 
      } 
     } else if (evt.getStateChange() == ItemEvent.DESELECTED) { 
      field1TF.setEditable(true); 
      field1TF.setText("DESELECTED"); 
      field2TF.setEditable(true); 
      field2TF.setText("DESELECTED"); 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     boolean selected = checkbox.isSelected(); 
     System.out.println("Checkbox " 
      + (selected ? "is" : "is not") + " selected."); 
      if (selected) { 
       //some stuff 
      } else { 
       //some reversal stuff 
      } 
    } 

    protected void displayMessage(String message) { 
     display.append(message + newline); 
     display.setCaretPosition(display.getDocument().getLength()); 
    } 

    @Override 
    public void componentHidden(ComponentEvent e) { 
     displayMessage(e.getComponent().getClass().getName() + " --- Hidden"); 
    } 

    @Override 
    public void componentMoved(ComponentEvent e) { 
     displayMessage(e.getComponent().getClass().getName() + " --- Moved"); 
    } 

    @Override 
    public void componentResized(ComponentEvent e) { 
     displayMessage(e.getComponent().getClass().getName() + " --- Resized "); 
    } 

    @Override 
    public void componentShown(ComponentEvent e) { 
     displayMessage(e.getComponent().getClass().getName() + " --- Shown"); 

    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ComponentEventDemo ced = new ComponentEventDemo(); 
      } 
     }); 
    } 
} 
+0

Me tomé la libertad de reformatear tu ejemplo y fusionar tu otra respuesta. En general, es mejor actualizar una respuesta, a menos que sea un enfoque significativamente diferente. +1, por cierto. – trashgod

+0

@ trashgod estuvo de acuerdo y con Delete también – mKorbel

0

Añadiendo un ItemL istener y la comprobación de isSelected lo hizo por mí:

 checkbox.addItemListener(new ItemListener() { 
       @Override 
       public void itemStateChanged(ItemEvent e) { 
        if(checkbox.isSelected()){ 
         System.out.println(checkbox.getText() + " ++ " + checkbox.isSelected()); 
         //do stuff 
        }else{ 
         System.out.println(checkbox.getText() + " -- " + checkbox.isSelected()); 
         //do other stuff 
        } 

       } 
     }); 
Cuestiones relacionadas