Toon posts:

[java] JProgressBar refresh tijdens iteratie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben voor het eerst bezig met een GUI aan het maken met JBuilder voor een export programma dat ik eerder had gemaakt.

Nu heb ik in die export een loop die een voor een database gegevens exporteerd en dat duur vrij lang. Nu had ik het idee om de gebruiker op de hoogte te houden van de voortgang met de JProgressBar te tonen.

Nu werkt dit (waarschijnlijk) wel gewoon goed, maar ik heb het probleem dat de GUI lijkt te hangen totdat de export is voltooid. Dus ik zie de progressbar niet bij elke iteratie updaten, maar wel de uiteindelijke 100%.

In VB kon ik herinneren dat er zoiets was als DoEvents, om de message queue even vrij te geven. Heeft Java ook iets dergelijks, zo ja hoe kan ik dit implementeren?

Bij voorbaat dank

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Waarschijnlijk loop je de event dispatching thread (de thread waarop swing ook zijn paints loopt te doen) te misbruiken om te laden. Dan krijg je dit soort problemen.

Het beste kan je die zware laadactie op een aparte thread laten lopen, en vanuit die thread die progressbar laten updaten. Hierdoor heeft de event dispatching thread wel de mogelijkheid om de repainten.

Ik weet niet of het je al is opgevallen.. maar je hele gui zit waarschijnlijk helemaal vast tijdens het laden.

[ Voor 27% gewijzigd door Alarmnummer op 05-08-2004 13:08 ]


Verwijderd

Topicstarter
Bedankt voor je senlle reactie. Ik begreep er helemaal niets van.

Ik denk dat je wel gelijk hebt. De GUI hangt idd helemaal.

Hoe kan ik de loop in een aparte thread gooien?
Doormiddel van de JMS oid?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op 05 augustus 2004 @ 13:14:
Bedankt voor je senlle reactie. Ik begreep er helemaal niets van.
Er is 1 grote hoofdthread binnen swing actief die alle updates ed regels. Op het moment dat jij die thread helemaal inzet om jou laadactie te doen, heeft die dus geen tijd meer om nog updates voor andere zaken uit te voeren.
Hoe kan ik de loop in een aparte thread gooien?
Doormiddel van de JMS oid?
stel je komt binnen bij een of andere actionListener:

code:
1
2
3
4
5
6
7
8
9
10
11
void actionPerformed(ActionEvent e){
     Thread t = new Thread(new LoadRunnable());
     t.start();
     //de eventdispatching thread is nu weer klaar om andere events te verwerken
}

class LoadRunnable implements Runnable{
      void run(){
           dikkeLader.laad();
      }
}



JMS is beeeetje overkill.

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Verwijderd schreef op 05 augustus 2004 @ 13:14:
Bedankt voor je senlle reactie. Ik begreep er helemaal niets van.

Ik denk dat je wel gelijk hebt. De GUI hangt idd helemaal.

Hoe kan ik de loop in een aparte thread gooien?
Doormiddel van de JMS oid?
Je export process in een apart proces (Thread) draaien (zoals hierboven al gezegd) .

Je kan mbv het Observable pattern heel netjes je export proces de gui laten updaten zonder dat je export process en je gui direct met elkaar verbonden zijn.

Bouw een Export class (implements Observable) en dan hang je je GUI als Observer aan je export class. Via de update() methode in je gui laat je je progressbar lopen.

Als je hier geen hout van kan maken, dan heb je nog wat te doen :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je moet dan nog wel aan de taak vragen uit hoeveel stappen het bestaat.

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Alarmnummer schreef op 05 augustus 2004 @ 13:38:
Je moet dan nog wel aan de taak vragen uit hoeveel stappen het bestaat.
Dat kun je in je export class bepalen.... daar bepaal je welk percentage in je gui wordt getoond.... ze hoeven elkaar niet te kennen.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

CK schreef op 05 augustus 2004 @ 14:10:
[...]
Dat kun je in je export class bepalen.... daar bepaal je welk percentage in je gui wordt getoond.... ze hoeven elkaar niet te kennen.
Je kan uiteraard zelf eenmalig nagaan hoeveel stappen een bepaald proces nodig heeft, maar ik zou het toch liever aan het proces overlaten.

Verwijderd

Topicstarter
Hartelijk bedankt!!
Het werkt nu fantastisch.

Ik ga nog even stoeien met 'Observable', maar zo werkt het ook al goed.
Pagina: 1