Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Problema con i thread

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    19

    Problema con i thread

    Salve a tutti, sto provando a creare una semplice interfaccia con un bottone e una label che viene modificata una volta premuto il bottone. Il problema per il quale mi rivolgo a voi e che non capisco perchè non mi aggiorna il text della label.
    Sotto riporto tutte e due le classi in cui una ha il thread e l'altra lo richiama dall'interfaccia. Mi sapreste dire perchè non va?


    Come potrete vedere nel codice riportato ho inserito nel ActionPerformed di getBtConnetti un ciclo while con loop infinito per simulare ciò di cui ho bisogno..cioè sfruttare la potenzialità del thread che si dovrebbe eseguire ed aggiornare la label a prescindere dal fatto che l'interfaccia sia impegnata in altro.

    Ho realizzato tutto secondo questa filosofia:
    L'interfaccia ha una funzione che richiama il thread tramite il metodo start e dall'altra parte il thread crea un'istanza dell'interfaccia e poi setta la label nel metodo run.

    Sicuramente data la mia non conoscenza corretta dell'argomento avrò scritto qualche sciocchezza...mi sapreste dire come sistemare il tutto??
    Spero che sia stato chiaro in ciò che sto facendo..eventualmente attendo domande per maggiori chiarimenti in merito al problema.

    Grazie!



    codice:
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import javax.swing.*;
    
    /**
     *
     * @author matteosciortino
     */
    public class FrameProva extends javax.swing.JFrame {
     private JButton btConnetti = null;
        public JLabel lbl2 = null;
        /** Creates new form FrameProva */
        public FrameProva() {
          
             add(getBtConnetti(), null);
             lbl2 = new JLabel();
            lbl2.setBounds(new Rectangle(15, 69, 106, 22));
            lbl2.setText(" Attesa connessione...");
            add(lbl2, null);
        }
    
    
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new FrameProva().setVisible(true);
                }
            });
        }
    
       
    private void Thread_label() 
    {
    Listen listen = new Listen(this);
    listen.start();
    }
    
       private JButton getBtConnetti()
        {
    
            if(btConnetti == null)
            {
                btConnetti = new JButton();
                btConnetti.setText("Connetti al server...");
                btConnetti.setLocation(new Point(164, 73));
                btConnetti.setSize(new Dimension(139, 20));
                btConnetti.addActionListener(new java.awt.event.ActionListener()
                {
    
                    public void actionPerformed(ActionEvent ae)
                    {
                        int a = 0;
                                while (a<10)
                                    {
                                    a = 3;
                                     Thread_label();
                                }
                      }
        
                });
                }
    
            return btConnetti;
        }
    
    }
    
    
    /------------------------------------------
    
    
    class Listen extends Thread {
    
    private FrameProva frame;
    
    /**
    * Creates a new instance of Listen
    */
    public Listen(FrameProva framee) {
    this.frame = framee;
    }
    
    public void run() {
    
    frame.lbl2.setText("Connessione avvenuta.");
    
    System.out.println("connesso al server... ");
    
    }}

  2. #2
    Devi richiamare il repaint del frame altrimenti come pensi che il frame si accorga che hai cambiato un label

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    19
    ah...ma come andrebbe scritto nel mio caso??? Me lo puoi dire?

  4. #4
    il repaint ti basta chiamare frame.repaint(). Ma nel tuo caso specifico non funzionerebbe in quanto il thread che si occuppa di gestire l'interfaccia è impegnato nel ciclo while.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    19
    ah..ok..quindi non può andare così...io avevo creato quel while perchè mi serviva per simulare un'attesa..
    Perche nel programma vero ho al posto del while una funzione che è abbastanza corposa e poi dopo che finisce deve darmi l'esito..

    Quindi cmq mi puoi dire che l'utilizzo del thread è giusto?? E' così che va usato? (lasciando perdere il while intendo).

    Ma se dovessi fare una barra di progressione per la percentuale di avanzamento di un processo come dovrei agire? Mi sai dire qualcosa..o postarmi un esempio schematizzato nei passaggi base per far ciò?

    Grazie ancora per le risposte!

  6. #6
    Allora il concetto è questo se vuoi che l'utente una volta cliccato possa cmq fare altro con il programma, ti basta spostare la chiamata alla funzione "pesante" sul thread e una volta che tale funzione è finita puoi avvertire l'utente in qualche modo.
    Per quanto riguarda la progress bar puoi dare un occhio al tutorial dell'oracle link

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.