¿Puede alguien explicarme por qué perdí la selección (establecida por setSelected()
) para JCheckBox
cuando puse el JOptionPane
en el ItemListener
? ¿Esto es un error?¿Por qué setSelected en JCheckBox pierde efecto?
Es curioso, que si este proceso se retrasa con invokeLater()
, setSelected()
funciona correctamente como esperaba.
de 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();
}
});
}
}
1+ pregunta. He visto esto antes y lo he resuelto como lo has hecho, al poner en cola la pantalla del JOptionPane en el EDT, pero no puedo explicarlo porque aún no he tenido tiempo ni energía para recorrer el código fuente. –
@Hovercraft Full Of Eels Depuro eso dentro de los métodos API de Java, antes de publicar esta pregunta aquí, todo se ve correctamente, el notificador se hace dentro de este método en ambos casos, aún no puedo encontrar la diferencia betweens (pasos dentro del método Java) llana JCheckBox y JCheckBox con JOptionPane, gracias por su confirmación – mKorbel