Ho letto che tutto il codice che costruisce componenti Swing e gestisce gli eventi deve essere eseguito dal thread di invio eventi. Capisco come questo viene realizzato utilizzando il metodo SwingUtilities.invokeLater()
. Si consideri il seguente codice in cui l'inizializzazione GUI viene fatta nel metodo main
séDove viene chiamato il thread di invio dell'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");
}
}
Come è possibile che questo codice funziona perfettamente? Stiamo costruendo JFrame
e chiamando un host di altri metodi nel thread principale. Non capisco esattamente dove l'EDT stia entrando in figura (quale codice sta eseguendo?). Anche il costruttore della classe GridBagLayoutTester
viene chiamato dal metodo main
, il che significa che EDT non lo sta eseguendo.
Insomma
- quando è l'EDT viene avviato? (la JVM avvia l'EDT insieme al metodo principale se l'EDT viene avviato durante l'esecuzione di questo codice?)
- Il codice del gestore eventi per il pulsante viene eseguito sull'EDT?
Per quanto riguarda Component.repaint() Dubito che questo solo "imposta un flag", che in realtà mette in coda un evento di pittura (che saranno poi elaborati dal EDT). – jfpoilpret
Il modello è lo stesso. Non è necessario conoscere l'interno del modo in cui viene gestito per utilizzare l'EDT con successo. –
quindi la chiamata frame.setVisible() viene eseguita sull'EDT? – Stormshadow