Dovremmo utilizzare EventQueue.invokeLater per qualsiasi aggiornamento della GUI in un’applicazione desktop Java?

So che utilizzando questo metodo, il parametro runnable viene inviato al sistema EventQueue. Ma tutti gli aggiornamenti della GUI dovrebbero essere eseguiti con questo metodo? Voglio dire, se voglio dire, cambiare un testo di JButton, dovrei usare qualcosa del genere:

java.awt.EventQueue.invokeLater(new Runnable() { public void run() { jButton1.setText("changed text"); } }); 

Se dovessi usare questo approccio, qualsiasi modello che possiamo usare per evitare questo codice ripetitivo?

È necessario utilizzare invokeLater quando si desidera aggiornare l’interfaccia utente da un altro thread che non è il thread dell’interfaccia utente (thread di invio eventi).

Supponiamo di avere un gestore per un clic del pulsante e di voler cambiare il testo di un’etichetta quando qualcuno fa clic sul pulsante. Quindi è perfettamente salvabile per impostare direttamente il testo dell’etichetta. Questo è ansible perché il gestore per l’evento click-button viene eseguito nel thread dell’interfaccia utente.

Supponiamo, tuttavia, che con un altro clic del tasto si avvii un altro thread che funziona un po ‘e al termine del lavoro, si desidera aggiornare l’interfaccia utente. Quindi usi invokeLater . Questo metodo garantisce che l’aggiornamento dell’interfaccia utente venga eseguito sul thread dell’interfaccia utente.

Quindi, in molti casi, non hai bisogno di invokeLater , puoi semplicemente fare direttamente gli aggiornamenti dell’interfaccia utente. Se non si è sicuri, è ansible utilizzare isDispatchThread per verificare se il codice corrente è in esecuzione all’interno del thread di invio dell’evento.

È necessario farlo solo se non si è già nel thread di invio dell’evento. A meno che non abbiate avviato nuovi thread o codice eseguito dal thread principale, probabilmente tutto il codice viene eseguito dal thread di invio degli eventi rendendo questo non necessario. Ad esempio, tutti i gestori di eventi dell’interfaccia utente vengono richiamati nel thread di invio eventi, quindi non è necessario farlo per il codice chiamato da lì.

Invece di evitare veramente “ripetitivi” (le persone di Java probabilmente direbbero, codice leggibile senza molti segreti) si potrebbe usare la funzione dei modelli di Eclipse. lo ho impostato per espandere le due lettere “il” al seguente blocco:

 EventQueue.invokeLater(new Runnable() { public void run() { try { // do something. } catch (Exception e) { e.printStackTrace(); } } }); 

Apparentemente questo disegno della coda di invio non è solo raccomandato, è fondamentalmente richiesto. Questo è forse il modo più rumoroso che abbia mai visto in una lingua per spingere un lambda in una coda di messaggi. Ma eccolo. Questo è java. E in difesa di Java, è certamente ovvio da quanto sopra esattamente cosa sta succedendo. Mi dispiace per la quantità di battitura, ma l’unica cosa che posso pensare è che eviterei i macro preprocessor C, e scommetto che a quelli di Java non piace usare quelli. L’espansione del codice tramite modelli è più leggibile, supportabile e non comporta alcuna magia nera.