Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    5

    [JAVA] Chiamare repaint() dopo un periodo di tempo

    Salve a tutti Sto uscendo di cervello per una cosa che almeno concettualmente appare semplice ... Ho una collezione di oggetti t in un'arraylist, la classe t ha un campo ImageBuffer picture, il paintComponent(Graphics) effettua una semplice g.drawImage(t.get(elementoCasuale).getPicture(), larghezza,altezza, null). Effettivamente ogni volta che viene chiamato il repaint() stampa una immagine casuale fra quelle contenute nei campi picture di uno qualsiasi degli elementi dell'arraylist. Ora, questi oggetti hanno anche un campo long time. Quando è passato un periodo pari a time (nanosecondi), dovrà essere chiamata la repaint() per disegnarne un altro, sempre casualmente. Ho provato con i thread, usando un timer, ho provato salvandomi in un long start il System.nanoTime() e controllando in un ciclo infinito che System.nanoTime()-start>=elementoCasuale.getTime() ma niente da fare... Sapete consigliarmi? In fondo in fondo è facile, mi basta davvero che ci sia un thread o un timer in background che passato un certo periodo di tempo: -Chiami repaint() -Riparta da 0 Graziee

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da call16 Visualizza il messaggio
    Ho provato con i thread, usando un timer, ho provato salvandomi in un long start il System.nanoTime() e controllando in un ciclo infinito che System.nanoTime()-start>=elementoCasuale.getTime() ma niente da fare... Sapete consigliarmi? In fondo in fondo è facile, mi basta davvero che ci sia un thread o un timer in background che passato un certo periodo di tempo: -Chiami repaint() -Riparta da 0 Graziee
    Il modo più semplice: javax.swing.Timer. Ma a prescindere dal modo di temporizzazione, basta che dopo un tot di tempo vai ad assegnare ad un campo di istanza l'indice nella lista (o direttamente il Image) e chiedi il repaint(). Il paintComponent userà quel indice (o Image). Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    5
    Grazie per la risposta! Quello che non capisco del Timer è come faccio a dirgli parti ed aspetta tot tempo all'oggetto timer.
    Nel frattempo, per chi fosse interessato ho trovato una soluzione girandoci intorno, ed il risultato è comunque quello che mi aspettavo (anche se non sono soddisfatto perchè non ho risolto un problema nel modo più efficente!!)

    public class TimedRepainter extends Thread()
    {

    public int secondsToWait;
    private JPanel toRefresh;
    private final int SECOND=1000;
    private int multiplier;
    private long startTime;
    public TimedRepainter(int a, JPanel p, int mul)
    {
    secondsToWait=a;
    toRefresh=p;
    multiplier=mul;
    }
    public void run()
    {

    while(secondsToWait>0)
    {

    startTime=System.currentTimeMillis();
    while(System.currentTimeMillis()-startTime<=multiplier*SECOND)
    {

    }
    secondsToWait-=multiplier;
    toRefresh.repaint();


    }
    this.interrupt();


    }
    }

    Un'istanza di TimeDecreaser(tempo,pannello,moltiplicatore) chiamerà la repaint di pannello, ogni moltiplicatore secondi, per un periodo pari a tempo secondi!
    Ultima modifica di call16; 17-10-2014 a 16:44

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da call16 Visualizza il messaggio
    Quello che non capisco del Timer è come faccio a dirgli parti ed aspetta tot tempo all'oggetto timer.
    public Timer(int delay, ActionListener listener)

    Quote Originariamente inviata da call16 Visualizza il messaggio
    Nel frattempo, per chi fosse interessato ho trovato una soluzione girandoci intorno, ed il risultato è comunque quello che mi aspettavo (anche se non sono soddisfatto perchè non ho risolto un problema nel modo più efficente!!)
    Ehm ... no, confermo. Non è per niente buono!


    P.S.: inoltre da quanto posso capire, la estrazione dell'indice a caso la fai nel paintComponent. Anche questo è sbagliato. Il repaint di un componente può avvenire per svariati motivi (e anche tantissime volte), non solo per il tuo repaint temporizzato!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.