Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Scrittura immediata su JTextArea

    Ciao a tutti!
    Ho un quesito da sottoporvi: ho un'applicazione che legge dati da un file txt, li manipola e poi fornisce il risultato in una JTextArea. Per stampare su questa, uso una variabile di tipo StringBuffer, aggiungendovi tramite il metodo append le stringhe che devo stampare e richiamando infine il metodo setText per stamparla sulla JTextArea.
    Funziona tutto ma devo aspettare che la manipolazione sia finita per vedere il risultato.
    C'è il modo di vedere stampato sulla JTextArea il risultato (e quindi la StringBuffer) man mano che si riempie?

    Grazie!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Scrittura immediata su JTextArea

    Originariamente inviato da crash_tension
    C'è il modo di vedere stampato sulla JTextArea il risultato (e quindi la StringBuffer) man mano che si riempie?
    Sì (anche se sarebbe di certo meno performante rispetto ad impostare il testo una volta sola). JTextArea ha un metodo append() per appendere del testo nel documento.

    Ma, nota bene, bisogna vedere in quale contesto fai la lettura/elaborazione del file. Non hai specificato bene questo punto ma queste operazioni dovresti farle in un thread separato, non nel contesto del EDT (event dispatch thread).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    provo a postare il codice che magari vi aiuta:

    Codice PHP:
    startProgram.addActionListener(
                    new 
    ActionListener(){
                        public 
    void actionPerformed ActionEvent e){
                            try {
                                
    pff = new ParserFromFile();
                            } catch (
    IOException e1) {e1.printStackTrace();}
                            
    prVector pff.getPrVector();
                
                            for(
    int i=0i<prVector.size(); i++){
                                
    boolean isPing false;
                                
    String lnk;
                                
    lnk sip + ((PrprVector.elementAt(i)).getPrId();
                                try {
                                    
    visitor = new PrVisitor(lnk, (PrprVector.elementAt(i));
                                } catch (
    IOException e1) {e1.printStackTrace();}
                                                            
                                ((
    PrprVector.elementAt(i)).calc(look);
                                
    isPing = ((PrprVector.elementAt(i)).evaluate();
                                
                                if(
    isPing){
                                    
    outputString.append( ((Pr)prVector.elementAt(i)).getPrName()+" " );
                                    
    outputString.append( ((Pr)prVector.elementAt(i)).getPrId()+ "\n" );
                                    
    outputString.append"i1:"+((Pr)prVector.elementAt(i)).getI1()+"\n" );
                                    
    outputString.append"i2:"+((Pr)prVector.elementAt(i)).getI2()+"\n" );
                                    
    outputString.append"i3:"+((Pr)prVector.elementAt(i)).getI3()+"\n" );
                                    
    outputString.append"i4:"+((Pr)prVector.elementAt(i)).getI4()+"\n\n" );
                                    
    outputArea.setText(outputString.toString());
                                    
    outputArea.setFont(fB);
                                }
                            }
                        }
                    }
            ); 

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da crash_tension
    provo a postare il codice che magari vi aiuta
    Sì, e si capisce subito che fai tutto quanto dentro il actionPerformed() e quindi nel contesto del EDT. Se anche facessi ogni tanto dei textArea.append(qualcosa), non vedresti un inserimento progressivo perchè stai tenendo tu impegnato il EDT e tutto quanto il testo apparirebbe di botto solo quando il controllo ritorna al framework, ossia dopo la terminazione di actionPerformed.

    E il fatto che stai tenendo tu impegnato (e possibilmente per un tempo più o meno lungo a seconda del file e della elaborazione), significa anche che in quel lasso di tempo la tua interfaccia utente è praticamente "congelata".

    Consiglio di leggere: Threads and Swing
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    già, confermo il "freeze" della GUI. Quindi se il problema è questo, potrei fare la seguente cosa:
    metto il calolo fuori dall'addActionListener (in pratica sposto fuori dall'addActionListener dal for in poi)...in effetti, prVector viene riempito lì, i calcoli posso farli anche fuori. Così facendo, ottengo l'effetto da me desiderato o devo usare per forza i Thread?

    grazie!

  6. #6
    Risolto, scrivo che magari può servire a qualcun altro.
    Ho creato una classe
    Codice PHP:
    public extends Thread{
       public 
    void run(){
              
    //inserito il pezzo del for
       
    }

    Ho tolto dall'addActionListener tutto il pezzo del for (che ho spostato nella classe C) inserendo al suo posto il seguente codice:
    Codice PHP:
    C e = new C();
    e.start(); 
    ...funziona tutto!!
    ciao e grazie ancora!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.