PDA

View Full Version : [Java] Classe javax.swing.Timer: più veloce no???


fbcyborg
02-07-2007, 22:33
Devo far scatenare un evento in maniera ripetuta a seconda della velocità che imposto dinamicamente grazie a una JSlider.

In pratica, la JSlider va da 1 a 30. Siccome voglio che a 1 vada piano e a 30 vada veloce, faccio l'inverso del getValue() della JSlider e ottengo l'effetto desiderato.

Ora il problema è che se imposto la JSlider a 1, mi va piano ok.. ma da 2 a 30 la velocità, è si maggiore, ma qualsiasi valore metto fra 2 e 30 la velocità non cambia.

Suppongo sia un problema dovuto al fatto che Timer non supporta delay che siano frazioni di millisecondi, quindi che io metta 1/2 o 1/30 non gli fa tanta differenza. anzi.. è uguale, visto che poi mi sa che approssima sempre a 1....
solo che mi viene il dubbio di come non approssimi a 0 scatenando una divByZero.

Boh...

Come faccio ad incrementare la velocità di timer in modo più sensibile?

mad_hhatter
03-07-2007, 08:27
invece che fare 1/X perchè non fai, ad esempio, 31 - X che vale 1 quando X=30 e 30 quando X=1 ?

prova a vedere nella documentazione se Timer accetta anche i nanosecondi (di default usa solo millisecondi)

andbin
03-07-2007, 08:34
Ora il problema è che se imposto la JSlider a 1, mi va piano ok.. ma da 2 a 30 la velocità, è si maggiore, ma qualsiasi valore metto fra 2 e 30 la velocità non cambia.

Suppongo sia un problema dovuto al fatto che Timer non supporta delay che siano frazioni di millisecondi, quindi che io metta 1/2 o 1/30 non gli fa tanta differenza. anzi.. è uguale, visto che poi mi sa che approssima sempre a 1....
solo che mi viene il dubbio di come non approssimi a 0 scatenando una divByZero.Innanzitutto il tempo di delay lo si imposta in millisecondi, quindi è ovvio che frazioni di millisecondo non le puoi gestire!

Poi bisogna vedere come hai fatto il calcolo del tempo. Se hai fatto una divisione (come mi pare di capire), non vorrei che tu l'abbia fatta intera.

Io farei così: se a 1 deve andare piano e a 30 andare veloce, si può fare la seguente divisione: 1000 / n. Così se n vale 1 hai 1 secondo e se n vale 30 hai 33 millisecondi.

EDIT: È chiaro che con una divisione non hai una progressione lineare. Invece di una divisione si puoi anche fare m*(31-n) dove 'm' è un valore in millisecondi che preferisci.

fbcyborg
03-07-2007, 09:15
Innanzi tutto grazie mille per le risposte.

Ho fatto 100/n, dopo aver provato anche un fattore 1000 e 10.
Quello che vorrei (anche usando una JSlider da 0 a 100) sarebbe un aumento decisamente visibile di velocità, con una velocità altissima quando la barra è al massimo...

andbin
03-07-2007, 09:31
Innanzi tutto grazie mille per le risposte.

Ho fatto 100/n, dopo aver provato anche un fattore 1000 e 10.
Quello che vorrei (anche usando una JSlider da 0 a 100) sarebbe un aumento decisamente visibile di velocità, con una velocità altissima quando la barra è al massimo...Velocità altissima ... quanto?? Perché tra i limiti del S.O., limiti di Swing (gestione degli eventi, ecc...) meno di 10 millisecondi non credo che riesci ad ottenerli!

fbcyborg
03-07-2007, 09:33
OK!!!

allora a posto.. va bene così.

Grazie!

Ciao ;)