JButton ActionListener – Aggiornamenti della GUI solo dopo aver fatto clic su JButton

Sto avendo un problema con il mio JButton ActionListener. Ho un metodo doTheCleaning () definito in un’altra class che quando chiamato effettua serie di modifiche alla mia GUI.

public void doTheCleaning(){ //change image icon //had thread.sleep here //insert to text area //had thread.sleep here //etc } 

Poi in un’altra class ho istanziato la class contenente il mio metodo doTheCleaning () e ho scritto il mio ActionListener con il mio metodo actionperformsd () per il mio jbutton scritto in questo modo:

 public void actionPerformsd(ActionEvent e){ //some code //newClass.doTheCleaning(); } 

So come fare il resto come addActionListener () e roba quindi non c’è bisogno di chiedermelo. La mia preoccupazione è che tutte le modifiche nella GUI eseguite quando si chiama il metodo doCleaning () si applichino solo dopo aver fatto clic sul pulsante. Quando ciò accade, la successione tra i cambiamenti avvenuti nelle mie etichette e nell’area di testo non è stata mostrata. Il codice funziona bene se l’ho chiamato direttamente nella mia class tester, ma chiamandolo all’interno del metodo actionperformsd mostra solo lo stato finale della mia GUI. Ho bisogno di mostrare quale elemento è cambiato prima, poi cosa c’è dopo, e così via.

Come posso ottenerlo quando ho bisogno che queste modifiche si verifichino solo quando clicco su JButton?

** Non sono ancora così bravo con la GUI in Java. Spero che voi ragazzi abbiate compreso il mio punto senza che abbia dato il mio codice. ma potrei, se necessario. Grazie.

Non eseguire operazioni intensive all’interno di EDT , altrimenti la GUI non risponderà e potresti non vedere gli aggiornamenti della GUI. La scelta migliore che puoi utilizzare è SwingWorker :

  • Sostituire doInBackground() e inserire qualsiasi operazione lunga all’interno di questo metodo in modo che venga eseguito su un thread separato anziché su EDT .

  • Per qualsiasi creazione di GUI o per modificare gli stati dei componenti della GUI all’interno di doInBackground() , utilizzare publish(V... chunks) per inviare i dati da process(List chunks) . È necessario eseguire l’override del process(List chunks) . Si noti inoltre che il process(List chunks) viene eseguito su EDT .

  • Dopo che doInBackground() ritorna, done() viene eseguito su EDT e puoi sovrascriverlo per usarlo per qualsiasi aggiornamento della GUI. È anche ansible recuperare il valore restituito da doInBackground() utilizzando get() .

  • Nota che SwingWorker è generico e devi specificare i tipi. T è il tipo di object restituito da doInBackground() e get() , mentre V è il tipo di elementi che hai passato per process(List chunks) tramite publish(V... chunks) .

  • execute() metodo execute() avvia lo swing worker richiamando prima doInBackground() .

Per ulteriori informazioni su questo, si prega di leggere Concurrency in Swing .