Wątek przeniesiony 2015-01-06 06:30 z Java przez bogdans.

Opóźnione wyświetlanie tekstu w jTextArea

0

Piszę program który wykonuje pętle i za każdym obrotem pętli chce wyświetlić tekst.
W System.out.print(); wyświetla się wszystko dobrze natomiast w jTextArea wyświetla się z opóźnieniem dopiero po wykonaniu całej pętli.

tu wstawiam kod przykładowego programu co wyświetla nr licznika ( i ):

 
package textarea;

import java.util.logging.Level;
import java.util.logging.Logger;


public class textarea extends javax.swing.JFrame {


    public textarea() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        jButton1.setText("Start");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 258, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 166, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 82, Short.MAX_VALUE)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        for (int i=0;i<11;i++){
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                Logger.getLogger(textarea.class.getName()).log(Level.SEVERE, null, ex);
            }
           System.out.print(" "+i);
           jTextArea1.setText(jTextArea1.getText()+" "+i);
            
            
        }
    }                                        

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new textarea().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration                   
}
0

ewidentnie wstrzymujesz wątek GUI, właściwie co Ty chcesz osiągnąć?

0

Wstrzymuje na pół sekundy żeby program trochę wolniej się wykonywał, aby problem który opisałem był bardziej widoczny.

A problemem jest to że jTextArea wyświetla się dopiero po zakończeniu działania procesu. Zależy mi aby za każdym okrążeniem pętli aktualizował się tekst a nie tylko na koniec.

Dla przykładu podałem wartość licznika jako tekst, który ma się wyświetlić.

1
private int counter = 0;
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        new Timer(500, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jTextArea1.append("" + counter++);
            }
        }).start();
    }
0

Wielkie dzięki działa :D

0

Jeszcze male pytanko.
jak zatrzymać ten timer dla np: counter == 10


private int counter = 0;
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        new Timer(500, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jTextArea1.append("" + counter++);
                if (counter==10) stop();
            }
            private void stop() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        }).start();

Bo np ten zapis wywala mi wyjątek.

1

Działa, ale niezbyt eleganckie związanie

private int counter = 0;
    final Timer timer = new Timer(2000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            jTextArea1.append("" + counter++);
            if (counter == 11) {
                timer.stop();
            }
        }
    });

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            timer.start();
    }
0

Wielkie Dzięki...

1 użytkowników online, w tym zalogowanych: 0, gości: 1