He leído que todo el código que construye los componentes Swing y maneja los eventos debe ser ejecutado por el hilo de envío del evento. Entiendo cómo se logra esto al usar el método SwingUtilities.invokeLater()
. Considere el siguiente código donde la inicialización interfaz gráfica de usuario se realiza en el método en sí main
¿Cómo se llama la secuencia de envío del evento?
public class GridBagLayoutTester extends JPanel implements ActionListener {
public GridBagLayoutTester() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
JButton button = new JButton("Testing");
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
button.addActionListener(this);
add(button, gbc);
}
public void actionPerformed(ActionEvent e) {
System.out.println("event handler code");
}
public static void main(String[] args) {
JFrame frame = new JFrame("GridBagLayoutDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(new GridBagLayoutTester(), BorderLayout.CENTER);
frame.setSize(800, 600);
frame.pack();
frame.setVisible(true);
System.out.println("Exiting");
}
}
¿Cómo es que este código funciona perfectamente? Estamos construyendo JFrame
y llamando a un host de otros métodos en el hilo principal. No entiendo dónde está exactamente el EDT entrando en la imagen aquí (¿qué código está ejecutando?). El constructor de la clase GridBagLayoutTester
también se llama desde el método main
, lo que significa que EDT no lo está ejecutando.
En resumen
- Cuando se está iniciando la EDT? (¿la JVM inicia el EDT junto con el método principal si en todo el EDT se inicia al ejecutar este código?)
- ¿Se ejecuta el código del controlador de eventos para el botón en el EDT?
En cuanto Component.repaint() Dudo que esto sólo "establece una bandera", en realidad se pone en cola un evento de pintura (que luego serán procesados por el EDT). – jfpoilpret
El patrón es el mismo. No necesita conocer los aspectos internos de la forma en que se maneja esto para utilizar el EDT con éxito. –
para que la llamada frame.setVisible() se ejecute en el EDT? – Stormshadow