Avatar billede zapzie Nybegynder
11. august 2004 - 09:57 Der er 21 kommentarer og
2 løsninger

JTextArea opdatere ikke løbende

Hvis man nu laver en løkke der skriver 1000 tilfældige tal ud løbende, i en konsol, så virker det fint.
Hvis jeg prøver det samme i en JTextArea, så skriver den først tallene når den er helt færdig med løkken.
Hvofor gør den det og hvordan kan de løses?
Avatar billede mikkelbm Nybegynder
11. august 2004 - 10:08 #1
Det er fordi, når du kører noget i GUI, kører GUI'en sin egen tråd.
Det vil sige, at hvis du kører en løkke, blokerer du for denne tråd, og den opdateres først, når din løkke/tråd er færdig.

Jeg finder lige et eksempel på hvordan du kan gøre det.
Avatar billede zapzie Nybegynder
11. august 2004 - 10:09 #2
Jo tak, det ville være rart. :)
Avatar billede mikkelbm Nybegynder
11. august 2004 - 10:11 #3
Du kan prøve at se dette spørgsmål:

http://www.eksperten.dk/spm/526764

Denne bruger har samme problem, og jeg har lavet et eksempel til ham.
Se om du kan bruge det, ellers spørger du bare.
Avatar billede mikkelbm Nybegynder
11. august 2004 - 10:12 #4
Altså, løsningen er at lave en tråd (Thread) der kører uden for GUI-klassen!
Avatar billede arne_v Ekspert
11. august 2004 - 10:18 #5
Jeg er alt for langsom !


import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;

public class DynNum extends JFrame implements ActionListener {
    private JTextArea txt;

    private JButton btn;
    public DynNum() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridLayout(2, 1));
        txt = new JTextArea();
        getContentPane().add(txt);
        btn = new JButton("Start");
        btn.addActionListener(this);
        getContentPane().add(btn);
        pack();
    }
    public void addNum(int n) {
        txt.setText(txt.getText() + " " + n + "\r\n");
        pack();
    }
    public void actionPerformed(ActionEvent ev) {
        if (ev.getSource() == btn) {
            T t = new T(this);
            t.start();
        }
    }
    public static void main(String[] args) {
        DynNum f = new DynNum();
        f.show();
    }
}

class T extends Thread {
    private DynNum dn;
    public T(DynNum dn) {
        this.dn = dn;
    }
    public void run() {
        Random rng = new Random();
        for(int i = 0; i < 10; i++) {
            dn.addNum(rng.nextInt(100));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }
}
Avatar billede zapzie Nybegynder
11. august 2004 - 11:12 #6
Fatter total minus af det der, men det virker.
Hvad er pack() ?
Hvad gør t.start() ?
Hvad gør f.show() ?
Avatar billede mikkelbm Nybegynder
11. august 2004 - 11:15 #7
pack() - tilpasser GUI'en (størrelsen)
t.start() - starter den tråd der der skal opdatere tekstfeltet
f.show() - fortæller JFramen at den skal være synlig på skærmen
Avatar billede mikkelbm Nybegynder
11. august 2004 - 11:17 #8
I Arnes eksempel er t en instance af klassen T.
t.start() fortæller tråden, at den skal udføre sin run-metode.
Avatar billede mikkelbm Nybegynder
11. august 2004 - 11:18 #9
God blanding af sprogene (dansk/engelsk) jeg fik lavet der:
instance = instans
Avatar billede zapzie Nybegynder
11. august 2004 - 11:19 #10
kan man ikke bare kalde t.run() ?
Avatar billede zapzie Nybegynder
11. august 2004 - 11:20 #11
f.show() er som at kalde f.setVisible(true) eller hva?
Avatar billede arne_v Ekspert
11. august 2004 - 11:20 #12
Swing har sin egen måde at gøre ting på. Hvis du læser lidt om Swing vil du se at
pack og show er noget man altid gør i Swing applikationer.

Du kan læse om Swing her:
  http://java.sun.com/docs/books/tutorial/uiswing/index.html
Avatar billede zapzie Nybegynder
11. august 2004 - 11:24 #13
Thread.sleep(1000); <-- når den bliver kaldt, arbejder GUIen så videre i de millisekunder?
Avatar billede arne_v Ekspert
11. august 2004 - 11:24 #14
Hvis du kalde t.run, så kalder du bare metoden. start starter en ny tråd som kalder
run metoden.
Avatar billede arne_v Ekspert
11. august 2004 - 11:25 #15
Thread.sleep(1000);

venter 1 sekund (1000 millisekunder).

Når det er i en seperat tråd så kører GUI videre.

Hvis det var i en GUI event så ville GUI hænge.
Avatar billede mikkelbm Nybegynder
11. august 2004 - 11:26 #16
Ja, det er kun tråden T der bliver sat til at sleepe.
Avatar billede zapzie Nybegynder
11. august 2004 - 11:26 #17
Start start() altid metoden run ?
Avatar billede arne_v Ekspert
11. august 2004 - 11:27 #18
Ja når du kalder start på en tråd så vil den nye tråd altid køre run.
Avatar billede zapzie Nybegynder
11. august 2004 - 11:29 #19
Ok. Tror jeg er ved at forstå det. Hvis i lige smider nogle svar, så kan i får nogle points.
Avatar billede mikkelbm Nybegynder
11. august 2004 - 11:33 #20
Bare en lille note (til Arne)

11.20.41 >> "... og show er noget man altid gør i Swing applikationer."

show() og show(boolean) er fra Java 1.5 blevet deprecated
- brug istedet setVisible(boolean)

(om det så holder i den endelige release af 1.5, må vi jo så vente på at få at vide)
Avatar billede mikkelbm Nybegynder
11. august 2004 - 11:33 #21
og et svar
Avatar billede arne_v Ekspert
11. august 2004 - 11:36 #22
Ak ak - så skal man til at lære noget nyt. Suk.
Avatar billede arne_v Ekspert
11. august 2004 - 11:37 #23
Og et svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester