Mi appello agli utenti che hanno partecipato a questa discussione:
http://www.hwupgrade.it/forum/showthread.php?t=2038842
Mi sembrano abbastanza esperti nell'argomento e credo che possano aiutarmi.
Il discorso mi è stato molto utile ma siccome necessito di accelerare i tempi
non posso approfondire da solo l'argomento ed ho bisogno di qualche consiglio
pratico per il mio caso che è un po più articolato.
Cerco di farla breve. Sto creando il gioco briscola con interfaccia grafica.
Ogni volta che l'utente gioca (clicca sulla carta) ovviamente c'è la logica
che fa i suoi calcoli e la grafica che si aggiorna. Ho problemi tecnici con
l'aggiornamento della grafica. Sfruttando gli esempi postati nella discussione
che ho linkato ho scritto questo ascoltatore per i pulsanti (le carte) del
giocatore umano:
Codice:
package gui;
import gui.GuiPartita;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.SwingUtilities;
import singleplayer.Partita;
public class MyListenerGiocatore implements ActionListener {
private GuiPartita gp;
private Partita p;
public MyListenerGiocatore(GuiPartita gp, Partita p) {
this.gp = gp;
this.p = p;
}
public void actionPerformed(ActionEvent event) {
computazione(gp,event);
}
private void computazione(final GuiPartita gp, final ActionEvent e)
{
Runnable computazione = new Runnable() {
@Override
public void run() {
//calcolo
if(e.getSource().equals(gp.primaCartaGiocatore)) {
System.out.println("Il giocatore gioca la carta: " + p.getGiocatore().getPrimaCarta() + "\n");
p.setStato(1);
p.interfacciamentoUtente(1);
}
if(e.getSource().equals(gp.secondaCartaGiocatore)) {
System.out.println("Il giocatore gioca la carta: " + p.getGiocatore().getSecondaCarta() + "\n");
p.setStato(1);
p.interfacciamentoUtente(2);
}
if(e.getSource().equals(gp.terzaCartaGiocatore)) {
System.out.println("Il giocatore gioca la carta: " + p.getGiocatore().getTerzaCarta() + "\n");
p.setStato(1);
p.interfacciamentoUtente(3);
}
// qui ha finito: accoda evento grafico
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run() {
gp.aggiornaGrafica();
gp.repaint();
}
});
}
};
(new Thread(computazione)).start();
}
}
Ovviamente non basta perché così facendo la grafica si aggiorna
correttamente solo quando è l'umano a giocare. Deve aggiornarsi anche
quando è il computer a giocare e lo fa in automatico. Come risolvo questo
piccolo problema?
C'è anche il caso particolare della fine della partita. Da qualche parte
devo controllare se la partita è ancora in corso, e se finisce aprire una
nuova finestra che mostra il risultato. Può essere un'azione svolta in
background utilizzando un worker thread? Vi prego un piccolo aiuto, grazie