Wątek przeniesiony 2015-01-06 06:30 z przez bogdans. Powód: Wątek dotyczący podstaw

Opóźnione wyświetlanie tekstu w jTextArea

Odpowiedz Nowy wątek
2015-01-05 22:46
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                   
}
edytowany 2x, ostatnio: bogdans, 2015-01-06 06:28
Wstawiaj kod w znaczniki &lt;code=java&gt;&lt;/code&gt; - bogdans 2015-01-06 06:29

Pozostało 580 znaków

2015-01-05 23:53
0

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

Pozostało 580 znaków

2015-01-05 23:58
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ć.

edytowany 1x, ostatnio: TomDom, 2015-01-05 23:59

Pozostało 580 znaków

2015-01-06 00:45
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();
    }

Pozostało 580 znaków

2015-01-06 07:39
0

Wielkie dzięki działa :D

Pozostało 580 znaków

2015-01-06 08:48
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.

edytowany 3x, ostatnio: TomDom, 2015-01-06 08:59

Pozostało 580 znaków

2015-01-06 09:07

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();
    }

Pozostało 580 znaków

2015-01-06 09:19
0

Wielkie Dzięki...

Jeśli wątek uważasz za zakończony - rozdaj plusiki pomocnym postom i zaznacz fajeczkę przy poście z rozwiązaniem problemu (możesz także zaakceptować swój post, jeśli zawiera rozwiązanie); - furious programming 2015-01-06 18:00

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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