Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    5

    [Java] aggiornamento grafica di un bottone ad ogni iterazione di ciclo

    Ciao a tutti!! Sono nuovo del forum, mi sa che dovrete avere un pò di pazienza
    Sto realizzando un mini programma.. Ho un bottone con etichetta 5, semplicemente vorrei che quando viene schiacciato passi da 5 a 10 ma che ogni secondo si veda l'etichetta passare da 5 a 6, 7, 8 e così via fino a 10. Ho provato ad utilizzare sia Timer che sleep() con annesso repaint() ma non mi funziona, qualcuno può aiutarmi?? Vi posto il codice.. Grazie!!
    codice:
    public class Prova     {
    private JButton bottone;   private JFrame f;   private JPanel p;   protected Timer t;
        
        public Prova()   {
            f= new JFrame("Prova");        p=new JPanel();        bottone= new JButton("5");
            bottone.addActionListener(new Listener());        p.add(bottone);
            t=new Timer(6000, new Listener());
            f.add(p);     f.pack(); f.setLocationRelativeTo(null);           
            f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);        f.setVisible(true);    }
    
        public static void main(String[] args){ Prova t=new Prova();  }
    
        class Listener implements ActionListener    {
            public void actionPerformed(ActionEvent e)      {
                if(bottone==e.getSource()) {
                    for(int i=0; i<5;i++){
                        //t.start();
                        String a=bottone.getText();     //mi dà la stringa che all'inizio è "5"
                        int n=Integer.parseInt(a)+1;    //me la converte in intero e aggiunge 1
                        bottone.setText(""+n);           //dà al bottone la nuova etichetta
                        try{ Thread.sleep(1000); }
                        catch(Exception l){ System.out.println(l); }
                        //bottone.repaint();  }     }      }    }

  2. #2
    Ti consiglio di usare le classi Timer e TimerTask!

    Dai un'occhiata Timer e TimerTask

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    5
    Sia con sleep() che usando Timer e TimerTask il programma, quando schiaccio il bottone, aspetta 5 secondi e l'etichetta da "5" passa a "10"..invece io vorrei che da "5" aspettasse un secondo e passasse a "6", un altro secondo e passasse a "7" e così via.. timer funziona, è un problema di aggiornamento della grafica che non riesco proprio a risolvere..tra timer di swing, timer e timertask e sleep cmq il metodo con cui ho trovato meno problemi è sleep() xkè almeno questo ad ogni iterazione (quindi ad ogni secondo) stampa (ho messo dei System.out.println), gli altri due stampano tutto alla fine..

  4. #4
    Non so perchè mi ha duplicato il post.

  5. #5
    Ok ti propongo due soluzioni alternative:

    Uso della classe Thread:
    codice:
    class MyClass implements ActionListener{
       
        //...
    
       public void actionPerformed(ActionEvent e){
              //eseguito se viene cliccato il bottone in questione
              new MyThread().start();
    
       }
    
       class MyThread extends Thread{
          public void run(){
              //logica del processo + controllo n<=num_volte_intendi_eseguire_il_task
          }
       }
    }
    Uso della classe Timer e TimerTask
    codice:
    class MyClass implements ActionListener{
       
        //...
    
       public void actionPerformed(ActionEvent e){
              //eseguito se viene cliccato il bottone in questione
              Timer t = new Timer();
               t.schedule(new MyTask(), 1000, num_volte_intendi_eseguire_il_task);
    
       }
    
       class MyTask extends TimerTask{
          public void run(){
              //solo logica del processo
          }
       }
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    5
    GRANDE!!! con qualche piccola modifica funziona!! Grazie mille! Posto la soluzione così se qualcuno si trovasse ad avere il mio problema ha un'idea di come muoversi.. grazie ancora!!
    codice:
    public class Prova
    {
    private JButton bottone;
    private JFrame f;
    private JPanel p;
    protected int n;
    
        public Prova()    {
            f= new JFrame("Prova");        p=new JPanel();
            bottone= new JButton("5");        bottone.addActionListener(new Listener());        
            p.add(bottone);
            f.add(p);     f.pack(); f.setLocationRelativeTo(null);        
            f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
            f.setVisible(true); }
    
        class Listener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                Timer t= new Timer();
                t.schedule(new MyTask(), 500, 1000); //500=ritardo prima dell'inizio della 1^ esecuz, 
                                                                    //1000=intervallo tra le esecuz
        }    }
        class MyTask extends TimerTask {
            //private boolean esegui=true;
        public void run() {
            if(n<5) {
                String a=bottone.getText();
                int num=Integer.parseInt(a)+1;
                bottone.setText(""+num);
                n++;
            }
            else        { cancel(); }
            }
        }
    
        public static void main(String[] args)   { Prova m=new Prova();   }
    }

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.