View Full Version : Progetto Java - Minuti e Secondi
dwight93
19-02-2013, 13:16
Salve a tutti, per informatica io e un mio amico abbiamo deciso di creare la nostra versione del gioco dual n-back:
http://dual-n-back.com/
La mia domanda è come posso programmare un metodo che duri un certo numero di minuti? È possibile? Inoltre quando uso il metodo wait o thread.sleep, come mai questi due vengono sempre eseguiti per primi anche se li metto alla fine del codice?
dwight93
19-02-2013, 14:48
ok forse credo di aver trovato la soluzione, usando il timer della classe java.util.Timer o javax.swing.Timer. Al momento sto cercando di implementare il timer affinché si avvi quando un bottone viene premuto. Consigli?
dwight93
19-02-2013, 17:35
up.
dwight93
19-02-2013, 20:49
Nessuno mi sa aiutare? Ok rispiego il problema. L'interfaccia grafica per ora è molto semplice, ci sono 9 JLabel e un bottone. Quando il bottone viene premuto uno dei 9 JLabel viene colorato. Qui è il problema, come faccio ad implementare un timer che faccia rimanere il JLabel colorato per 3 secondi?
wingman87
19-02-2013, 21:00
Usare Timer è una buona idea:
http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html
Registri un ActionListener per il bottone, nel metodo actionPerformed disattivi il bottone, colori la label e fai partire il Timer a cui avrai associato un altro ActionListener che decolora la label e riattiva il bottone.
Unica nota, devi dire al Timer di scatenare l'evento una volta sola con il metodo setRepeats. Comunque è scritto anche nella documentazione.
dwight93
19-02-2013, 22:12
Grazie per la risposta, ma per precisare il bottone deve essere premuto una sola volta e tutto dovrebbe eseguito in modo automatico:
- Premo bottone Start.
- Primo Label viene colorato e rimane colorato per 3 secondi e dopo ridiventa invisibile.
- Secondo Label viene colorato e rimane colorato per 3 secondi e dopo ridiventa invisibile.
- E così via.
wingman87
19-02-2013, 22:23
Scusa ma non ho letto il funzionamento del gioco...
Se è come dici allora non usare il metodo setRepeats e ogni volta che viene scatenato l'evento del Timer spegni la label accesa e ne accendi un'altra, senza riattivare il bottone. Quando vuoi fermare il timer basta richiamare il metodo stop.
dwight93
19-02-2013, 22:49
Grazie ancora per la risposta, infatti avevo l'impressione che il metodo setRepeats non mi sarebbe servito. Comunque quando creo il timer nei parametri devo inserire quanti secondi voglio e un actionlistener. Quale actionlistener gli passo? Scusa ma sono ancora alle prime armi soprattutto con swing. Potresti farmelo vedere brevemente usando un jbutton?
wingman87
20-02-2013, 09:13
Una cosa del genere:
ActionListener buttonListener = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
button.setEnabled(false);
... //Colori la prima label
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
... //Mantieni un riferimento alla label attiva
public void actionPerformed(ActionEvent evt) {
... //Decolori la label attiva e ne colori un'altra
... //Quando vuoi terminare stoppi il timer e riattivi il bottone
}
};
new Timer(delay, taskPerformer).start();
}
};
button.addActionListener(buttonListener);
wingman87
20-02-2013, 20:33
Aggiungo che su Swing puoi leggere l'ottima guida di PGI-Bis:
http://www.hwupgrade.it/forum/showthread.php?t=2005654
dwight93
21-02-2013, 18:58
Grazie mille adesso funziona. Ma ho ancora una domanda come faccio a inserire tutto in un ciclo for? Ci sto provando da un po', però ho si colorano tutti di un colore e poi si decolorano tutti nello stesso momento, quando invece dovrebbe essere una alla volta.
wingman87
21-02-2013, 19:05
Qual è l'operazione che dovresti ripetere con un ciclo for?
dwight93
21-02-2013, 21:40
La colorazione e decolorazione dei label.
wingman87
21-02-2013, 22:29
Quello è compito dell'ActionListener del Timer.
public void actionPerformed(ActionEvent evt) {
... //Decolori la label attiva e ne colori un'altra
... //Quando vuoi terminare stoppi il timer e riattivi il bottone
}
Il Timer si premura di sollevare l'evento ogni tot secondi. Nel codice di esempio ogni 1 secondo.
int delay = 1000; //milliseconds
dwight93
21-02-2013, 22:44
sì ma le label sono nove, quindi mi serve un ciclo for.
wingman87
21-02-2013, 22:57
Guarda, io non ho capito esattamente quello che devi fare.
Quello che ho capito è che ogni tot secondi devi spegnere una label ed accenderne un altra.
Per far questo non ti serve un ciclo for perché ogni qualvolta viene sollevato l'evento del timer puoi spegnere la label attiva e accenderne un'altra.
Se c'è una logica particolare nell'accendere e spegnere le label non l'ho capito.
Se conosci la sequenza a priori potresti mettere le label in una pila prima di far partire il timer e poi, nel timer, sfilarle mano a mano che le accendi/spegni.
dwight93
21-02-2013, 23:04
ok credo di aver capito.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.