Delucidazioni su come si avvia di una applicazione

di il
2 risposte

Delucidazioni su come si avvia di una applicazione

Premetto che non sono ferratissimo su Java (anche se ritengo di avere fatto dei lavori carini) e che programmo per diletto.

Quando ho iniziato mettevo all'interno del main() tutti i metodi di inizializzazione.

Poi, vedendo molti esempi, ho iniziato a utilizzare questo sistema (l'app si chiama MyApp ovviamente): 

public static void main(String[] args) {

   java.awt.EventQueue.invokeLater(new Runnable() {
     public void run() {
       new MyApp();
     }
   });
 }
 
 public MyApp() {
 //costruttore
 
 }
  

senza peraltro capirne in pieno il significato.

Ovviamente i metodi di inizializzazione li mettevo poi nel Costruttore

A me sembrava che l'applicazione funzionasse in entrambi i modi.

Da buon Bilancia non riesco a fare a meno di capire, per quanto mi sarà possibile.

MyApp crea un oggetto MyApp? A che scopo? Ha a che fare con la gestione degli eventi?

Qualcuno può spiegarmi? Grazie

2 Risposte

  • Re: Delucidazioni su come si avvia di una applicazione

    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 {
        // ......
    }
  • Re: Delucidazioni su come si avvia di una applicazione

    Grazie mille andbin

    la tua risposta mi conferma quello che più o meno avevo intuito anche se in modo approssimativo.

    Proverò ad utilizzare la tua modalità alla prima occasione.

    grazie ancora

    P.S. bellissimo il gatto del tuo profilo

Devi accedere o registrarti per scrivere nel forum
2 risposte