angelo96 ha scritto:
Il mio problema consiste che la carta non si gira e non mostra il simbolo, ma aspetta ugualmente 5 secondi per come specificato nel sottoprogramma tempo(), a livello di codice non esegue una riga.
Nota innanzitutto che Thread.yield() NON ti serve e non ti garantisce un bel niente.
La questione/problematica è la "solita" che si incontra in questi casi, ovvero il "threading" (cioè come funzionano i thread) nelle interfacce grafiche.
Swing, come tanti altri framework grafici anche su altre piattaforme (e anche non Java), è
single-thread. La tua applicazione può avere quanti thread eventualmente ti servono ma per la gestione della interfaccia grafica esiste un singolo e UNICO thread che in AWT/Swing è chiamato convenzionalmente EDT (Event Dispatch Thread).
Questo thread è creato e gestito dal framework in modo automatico, non devi fare nulla in tal senso. Il EDT si occupa di svariati compiti, tra cui i più importanti: disegnare i componenti Swing e dispacciare gli eventi ai listener.
Ma è chiaro che essendo un singolo thread, o sta facendo una cosa o ne sta facendo un'altra. Se il framework invoca un actionPerformed per un evento, quello che tu fai sui componenti in quel contesto es. p1.setText("...") o l1.setIcon( ... ) o altri set/add/ecc... il risultato a livello visuale NON avviene subito. I componenti determinano se/dove/come ridisegnare il componente e poi tipicamente fanno la richiesta di un repaint "asincrono", che viene depositata nella "coda" degli eventi.
Il controllo DEVE ritornare al framework il prima possibile. Quindi actionPerformed deve terminare e il controllo poi ritorna al framework che in brevissimo tempo si accorgerà che nella coda c'è "un evento di repaint" da eseguire e quindi scatenerà tutta la logica di painting del/i componente/i coinvolto/i.
Quindi il succo è che se nel contesto di un actionPerformed (o altro evento) fai uno sleep o qualunque operazione "lunga" (accesso al file-system, query su DB o altro potenzialmente pesante), stai tenendo "impegnato" tu il EDT e quindi la tua interfaccia grafica è completamente "congelata". Nessun componente può essere aggiornato e nessun altro evento può essere dispacciato.
Swing funziona così. Hai una sola soluzione: comprendere BENE e in modo APPROFONDITO quanto ho detto e l'argomento in generale. Se non lo fai, te lo dico sinceramente, avrai SEMPRE problemi di questo tipo con le interfacce grafiche (Java/Swing ma anche in generale).