Toon posts:

[JAVA] Problemen met het achter elkaar uitvoeren van code

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste medetweakers,

Ik zit met het volgende probleem:
Ik heb een applicatie die media bestanden afspeelt. Net voordat het bestand geladen wordt wil ik een label laten zien met "Bezig met laden". Het probleem is dat het label nooit zichtbaar wordt.

Een versimpelde versie van mijn code:
Java:
1
2
3
4
5
6
7
private void speelMedia() {
  lblLaden.setVisible(true);
  filmpje.load("C:\\blaat.avi");
  filmpje.setVisible(true);
  filmpje.start();
  lblLaden.setVisible(false);
}

lblLaden krijg ik nooit te zien. Het label staat niet over het filmpje heen en is gewoon zichtbaar als ik lblLaden.setVisible(false) comment.

Ik heb al verschillende dingen geprobeerd met this.wait en Thread.sleep, maar dit heeft helaas niet geholpen. :'(

Weet iemand hier mischien een oplossing voor?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19-02 20:17

Robtimus

me Robtimus no like you

Ik ga er even vanuit dat dit wordt uitgevoerd vanuit een event handler?

Je moet even begrijpen dat alle GUI acties, inclusief event handling en repainten, door 1 enkele thread worden afgehandeld. Je merkt dit ook wel als je filmpje groter wordt: je GUI reageert tijdelijk nergens meer op. Wat er hier dus gebeurt is:
1) event wordt aangeroepen
2) commando voor label laten zien wordt gegeven - label laten zien zelf wordt gequeued (a)
3) filmpje wordt geladen
4) commando voor filmpje laten zien wordt gegeven - filmpje laten zien zelf wordt gequeued (b)
5) filmpje wordt gestart (maar is nog steeds onzichtbaar
6) commando voor label verbergen wordt gegeven - verbergen zelf wordt gequeued (c)
7) label wordt getoont (a)
8 ) filmpje wordt getoont (b)
9) label wordt verborgen (c)
Omdat 7-9 heel snel achter elkaar gebeuren merkt je niet eens dat je label wordt getoond.

De oplossing: dit geheel in een andere thread doen. Daarbij moet je SwingUtilities.invokeAndWait en/of SwingUtilities.invokeLater gebruiken voor het laten zien / verbergen van je label en filmpje.

[ Voor 5% gewijzigd door Robtimus op 11-06-2006 21:54 ]

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


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10-2025
Weet je zeker dat de "snelheid" van je code is? Ben je er al eens doorheen gestept om te kijken of het label uberhaupt wel wordt weergegeven ?
Want in princiepe als je een wait command opgeeft tussen het weergeven en feitelijk laden van je bestand dan _Moet_ je label wel worden weergeven. Vanuitgaande dat je code goed is natuurlijk...

Verwijderd

Topicstarter
@Ice-manX: Nee ik heb het gewoon los in mijn applicatie staan :X (ik weet het niet netjes)
@DeathRaven: Met stepthrough krijg ik de label wel te zien.

Na een tijdje te zitten vogelen met threads en event handlers zonder effect heb ik een iets andere (zeer ranzige) oplossing gevonden:

Java:
1
2
3
4
5
6
7
8
private void speelMedia() {
  lblLaden.setVisible(true);
  this.update(this.getGraphics());
  filmpje.load("C:\\blaat.avi");
  filmpje.setVisible(true);
  filmpje.start();
  lblLaden.setVisible(false);
}


Niet de netste oplossing maar het werkt wel. Toch bedankt voor jullie hulp. Vooral Ice-man voor het duidelijk maken van de onverklaarbare wereld van swing _/-\o_ .

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10-2025
oooeeii wat je daar doet is handmatig je gui een update forcen... In deze context is dat nog niet eens zo heel gevaarlijk... Maar pas ermee op als dat je dit niet in een lus ofzow gaat doen, anders kun je wel eens een enorm "flikker effect" krijgen in je gui en/of hoge cpu load :P

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 14:32
Ben wel benieuwd welke API je gebruikt voor het laden en afspelen de AVI.

Verwijderd

Topicstarter
@DDD: Ik gebruik Java Media Framework, hiermee kun je heel makkelijk filmpjes/geluid afspelen ed

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 14:32
Ja ik bedoel eigenlijk welke classes. Zat JMF naar aanleiding van dit topic een beetje te browsen en kon niet direct vinden welke classes je gebruikt.

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024

If you can't beat them, try harder


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 14:32
Tnx. :)
Pagina: 1