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?
Annonceindlæg fra Barco
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.
11. august 2004 - 10:09
#2
Jo tak, det ville være rart. :)
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.
11. august 2004 - 10:12
#4
Altså, løsningen er at lave en tråd (Thread) der kører uden for GUI-klassen!
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) { } } } }
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() ?
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
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.
11. august 2004 - 11:18
#9
God blanding af sprogene (dansk/engelsk) jeg fik lavet der: instance = instans
11. august 2004 - 11:19
#10
kan man ikke bare kalde t.run() ?
11. august 2004 - 11:20
#11
f.show() er som at kalde f.setVisible(true) eller hva?
11. august 2004 - 11:24
#13
Thread.sleep(1000); <-- når den bliver kaldt, arbejder GUIen så videre i de millisekunder?
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.
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.
11. august 2004 - 11:26
#16
Ja, det er kun tråden T der bliver sat til at sleepe.
11. august 2004 - 11:26
#17
Start start() altid metoden run ?
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.
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.
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)
11. august 2004 - 11:33
#21
og et svar
11. august 2004 - 11:36
#22
Ak ak - så skal man til at lære noget nyt. Suk.
11. august 2004 - 11:37
#23
Og et svar.
Kurser inden for grundlæggende programmering