26/07/2024 - Robroy ha scritto:
senza peraltro capirne in pieno il significato.
MyApp crea un oggetto MyApp? A che scopo? Ha a che fare con la gestione degli eventi?
La questione è lunga e non banale. Presumo la tua sia una applicazione Swing e non AWT. Swing (e anche AWT, sebbene con qualche diversità), non è thread-safe, cioè non può essere usato da qualunque thread. In Swing tutta la gestione è svolta da un singolo ed unico thread chiamato convenzionalmente il Event Dispatch Thread (EDT). Questo thread chiaramente fa una sola cosa per volta: o sta disegnando un componente, o sta dispacciando un evento, ecc… Tutto insomma è gestito ad “eventi” (anche il repaint di un componente è un evento).
Qualunque modifica alla UI (es. un setText su un componente, un add su un JPanel ecc..) va fatta solo (salvo pochi casi documentati) nel contesto di questo EDT. Usare il EventQueue.invokeLater (o SwingUtilities.invokeLater che è la stessa cosa) serve per far “passare” la esecuzione del run() nel contesto del EDT.
Fare questo all'inizio nel main(), è generalmente la cosa buona da fare per garantire che la creazione della UI parta già subito “confinata” nel EDT.
Cosa fai in quel run() ovviamente dipende da te, ma sicuramente ad un certo punto creerai es. un JFrame e lo renderai visibile. Ma non è per forza necessario creare una istanza di quella tua stessa classe (se non già essa un JFrame).
Io generalmente faccio una classe con il main che fa es.:
public class MyApp {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MyAppFrame frame = new MyAppFrame();
frame.setVisible(true);
}
});
}
}
public class MyAppFrame extends JFrame {
// ......
}