Toon posts:

[JAVA] Aparte thread voor JFrame

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een console geschreven die de System.out opvangt. Een simpele JFrame met daarin een JTextPane en een ConsoleOutputStream die de System.outs in de JTextPane plaatst.

Ik stuit nu op het volgende probleem:
Op het moment dat mijn programma ergens mee bezig is, dan wordt mijn Console JFrame niet ge-repaint. Hoe krijg ik voor elkaar dat mijn Console zijn eigen thread krijgt?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 13:34

momania

iPhone 30! Bam!

Je moet niet je frame een aparte thread geven, maar juist de taken die daarnaast worden uitgevoerd.

Verder is er _zat_ informatie te vinden over threading met een beetje google werk lijkt mij :?

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Topicstarter
De taken die worden uitgevoerd runnable maken bedoel je dan alle System.out.println() aanroepingen?

Als ik een runnable in mijn OutputStream plaats, dan heb ik als enig resultaat dat mijn printouts door elkaar komen te staan en niet dat mijn JFrame zichzelf repaint als ik erop klik terwijl mijn programma bezig is.
Java:
1
2
3
4
5
6
7
8
9
    public void write(final byte[] b){
        Runnable run = new Runnable() {
            public void run() {
                console.printString(new String(b));
            }
        };
        Thread t = new Thread(run);
        t.start();      
    }


Misschien is het handiger om van mijn console een apart programma te maken, aangezien mijn modal dialogs voorkomen dat ik mijn console kan bekijken. Maar ik wilde graag weten hoe dit mogelijk zou zijn.

[ Voor 9% gewijzigd door Verwijderd op 04-08-2005 11:40 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11:04

Robtimus

me Robtimus no like you

Gewoon, meerdere threads inderdaad.

Standaard heb je in een Java GUI 2 threads. De eerste zorgt voor het laten zien van je GUI en deze hangt nadat je de show of setVisible(true) op je frame etc hebt aangeroepen. De tweede wordt alleen gebruikt binnenin de GUI, en zorgt ervoor dat je events goed worden afgehandeld. Deze zorgt ook voor het repainten van de GUI. Daarom kun je intensieve operaties (zoals het inlezen) beter doen vanuit een andere thread. Deze kun je starten vanuit een event (actionlistener etc), of bij het opstarten (vlak voor de setVisible(true), of wanneer je ook wilt. Deze loopt dan parallel met de GUI thread (de main thread is nog steeds geblokkeerd ;)). Hierin kun je dan je System.out lezen, maar let op: je kan niet zomaar de GUI updaten vanuit deze thread. Daarvoor is er class javax.swing.SwingUtilities, en in het bijzonder 2 static methods ervan: invokeAndWait(Runnable) en invokeLater(Runnable). Het verschil tussen de twee hoef ik je denk ik niet uit te leggen ;)

More than meets the eye
There is no I in TEAM... but there is ME
system specs