Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319

    jTextArea non viene aggiornata correttamente

    Salve,
    ho questa semplicissima applicazione:
    consiste in un JPanel che contiene una jTextArea (contenuta a sua volta in un JScrollPane) e due jButton con etichetta "Chiudi" e "Vai", il primo chiude l'applicazione mentre su "Vai" ho definito un evento actionPerformed, per cui alla pressione di esso eseguo queste semplici istruzioni:
    codice:
    int index = 0;
    jTextArea1.setText("");
    while (index<1000) {
    index++;
    jTextArea1.append("Passo "+index+"\n");
    scriviFile();
    }
    mentre scriviFile(); è un metodo che provvede a scrivere 1000 volte (ovviamente è per una prova) un file.

    Il problema è che il contenuto di jTextArea1 NON viene aggiornato ad ogni iterazione del ciclo, ma dopo che è stato scritto 1000 volte il file, ossia dopo l'ultima iterazione :master:


    Posto per maggior chiarezza l'intero codice

    Grazie

    codice:
    package tools;
    
    import java.io.*;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.lang.String;
    
    public class ProvaLog extends javax.swing.JFrame {
        
        public ProvaLog() {
            initComponents();
        }
        
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
        private void initComponents() {
            jPanel1 = new javax.swing.JPanel();
            jScrollPane1 = new javax.swing.JScrollPane();
            jTextArea1 = new javax.swing.JTextArea();
            jButton2 = new javax.swing.JButton();
            jButton1 = new javax.swing.JButton();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("Prova Finestra di Log");
            jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Prova Log", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 12)));
            jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
            jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            jTextArea1.setColumns(30);
            jTextArea1.setFont(new java.awt.Font("Monospaced", 0, 13));
            jTextArea1.setRows(5);
            jScrollPane1.setViewportView(jTextArea1);
    
            jButton2.setText("Vai");
            jButton2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton2ActionPerformed(evt);
                }
            });
    
            org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
            jPanel1.setLayout(jPanel1Layout);
            jPanel1Layout.setHorizontalGroup(
                jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 38, Short.MAX_VALUE)
                    .add(jButton2)
                    .addContainerGap())
            );
            jPanel1Layout.setVerticalGroup(
                jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                        .add(jButton2)
                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
    
            jButton1.setText("Chiudi");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
    
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(jButton1))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(jButton1)
                    .addContainerGap())
            );
            pack();
        }// </editor-fold>//GEN-END:initComponents
        
        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
            vai();
        }//GEN-LAST:event_jButton2ActionPerformed
        
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
            System.exit(0);
        }//GEN-LAST:event_jButton1ActionPerformed
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new ProvaLog().setVisible(true);
                }
            });
        }
        
        private void vai() {
            int index = 0;
            jTextArea1.setText("");
            while (index<1000) {
                index++;
                jTextArea1.append("Passo "+index+"\n");
                scriviFile();
            }
        }
        
        private void scriviFile() {
            File descrizioni;
            String testo;
            int err;
            String filename_input = "";        
            
            filename_input = "C://prova_log___.txt";       
            descrizioni = new File(filename_input);
            if (!descrizioni.exists()) {
                try {
                    descrizioni.createNewFile();
                } catch (IOException e) {
                    System.out.println("Unable to create "+filename_input+": "+e.getMessage());
                }
            }        
            testo = "Questo è un file di testo utilizzato per una prova.";        
            try {
                scriviFile(descrizioni, testo);
            } catch (FileNotFoundException ex2) {
                System.out.println(ex2.getMessage());
            } catch (IOException ex2) {
                System.out.println(ex2.getMessage());
            }               
        }
    
            
        void scriviFile(File unFile, String testo) throws
                FileNotFoundException, IOException {
            if (unFile == null) {
                throw new IllegalArgumentException("File should not be null.");
            }
            if (!unFile.exists()) {
                throw new FileNotFoundException("File does not exist: " + unFile);
            }
            if (!unFile.isFile()) {
                throw new IllegalArgumentException("Should not be a directory: " + unFile);
            }
            if (!unFile.canWrite()) {
                throw new IllegalArgumentException("File cannot be written: " + unFile);
            }
            
            Writer output = null;
            try {
                output = new BufferedWriter(new FileWriter(unFile));
                output.write(testo);
            } finally {
                if (output != null) {
                    output.close();
                }
            }
            System.out.println("File creato...");
        }
        
        // Variables declaration - do not modify//GEN-BEGIN:variables
        private javax.swing.JButton jButton1;
        private javax.swing.JButton jButton2;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextArea1;
        // End of variables declaration//GEN-END:variables
    }
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

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

    Re: jTextArea non viene aggiornata correttamente

    Originariamente inviato da inc40
    Il problema è che il contenuto di jTextArea1 NON viene aggiornato ad ogni iterazione del ciclo, ma dopo che è stato scritto 1000 volte il file, ossia dopo l'ultima iterazione :master:
    Solite questioni sui thread. Quelle operazioni le stai facendo nel contesto del EDT (event dispatch thread) ... e finché lo tieni tu impegnato, non ci possono essere aggiornamenti della interfaccia utente (la interfaccia utente è "congelata", per dirlo in altro modo).

    Fai eseguire quelle operazioni in un thread separato.
    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 L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319

    Re: Re: jTextArea non viene aggiornata correttamente

    Originariamente inviato da andbin
    Solite questioni sui thread. Quelle operazioni le stai facendo nel contesto del EDT (event dispatch thread) ... e finché lo tieni tu impegnato, non ci possono essere aggiornamenti della interfaccia utente (la interfaccia utente è "congelata", per dirlo in altro modo).

    Fai eseguire quelle operazioni in un thread separato.
    Grazie mille per l'aiuto andbin...
    Purtroppo non sono molto pratico con i thread, potresti postarmi un codice esemplificativo, oppure uno pseudocodice già sarebbe qualcosa

    Grazie
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

  4. #4
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    Nessun aiuto?
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

  5. #5
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    Seguendo la guida contenuta quì e segnalata da andbin sono riuscito a creare una classe che implements Runnable nella quale ho riscritto i metodi scriviFile() e, nel metodo run(), ho inserito il codice che prima avevo messo nel metodo vai().
    Mi basterebbe a questo punto istanziare questa classe nel jButton2ActionPerformed, passare tale istanza al costruttore di Thread e richiamare quindi il metodo start().
    Ho il problema però di come passare la jTextArea al nuovo thread
    Come posso fare ?

    Grazie
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da inc40
    sono riuscito a creare una classe che implements Runnable

    Ho il problema però di come passare la jTextArea al nuovo thread
    Il Runnable l'hai implementato in una inner class? Le inner class hanno accesso ai membri della classe "contenitore", compresi quelli private.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    Originariamente inviato da andbin
    Il Runnable l'hai implementato in una inner class? Le inner class hanno accesso ai membri della classe "contenitore", compresi quelli private.
    Ora si...

    Grazie
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

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.