Archief - [Java/Swing] Venster always on top

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Vin

Legacy Member
Ik zou graag na de herexamens met een klein projectje beginnen.
Het projectje zou om de x aantal tijdseenheden gegevens van het internet moeten halen en deze ergens naar wegschrijven. Dit alles met de bijhorende views natuurlijk.
Nu had ik graag ook een klein "monitor"venstertje gehad dat zichzelf always on top plaatst ZONDER de focus op te eisen.
Ik heb reeds gegoogled, en hierbij botste ik op de methodes toFront() en setAlwaysOnTop().
Na even de documentatie geraadpleegd te hebben blijkt echter dat de methode toFront steeds de focus in het venster opeist, en dit is niet bepaald gewenst voor een "monitor"venstertje.
over de methode setAlwaysOnTop() (die JFrame zou overerven van Window) vind ik echter niks terug in de API.

Daarnaast had ik ook nog een vraag over het "om de x tijdseenheden gegevens ophalen".
Is het "stijlvol" om dit als volgt op te lossen (snel codeschetsje):
Code:
while (someControlBoolean){
          Thread.sleep(someAmountOfTime);
          model.update(collectData());
          someControlBoolean = shouldRepeat
}
of bestaat er een elegantere manier om zoiets te verwezenlijken?

Alvast bedankt voor de hulp

forloRn_

Legacy Member
Het bovenstaande werkt, maar het probleem is dat je lus niet onmiddellijk afloopt, maar pas wanneer sleep() en update() returnen, en dat kan lang duren. Je programma zal dus niet ogenblikkelijk afsluiten.

Code:
while (shouldRepeat) {
  try {
    Thread.sleep(someAmountOfTime);
    model.update(collectData());
  } catch (InterruptedException e) {
    // shouldRepeat is set to false so the loop ends
  } catch (ClosedByInterruptException e) {
    // ditto
  }
}

Maak van shouldRepeat een member variable, die volatile is. Om de thread te stoppen, zet je shouldRepeat op false, en roep je interrupt() aan op de thread die doorheen de lus gaat.

Dit is ook een oplossing:

Code:
while (true) {
  try {
    Thread.sleep(someAmountOfTime);
    model.update(collectData());

    if (thread.isInterrupted()) {
      break;
    }
  } catch (InterruptedException e) {
    break;
  } catch (ClosedByInterruptException e) {
    break;
  }
}

Om de thread te stoppen, roep je gewoon thread.interrupt() aan.

Denk ik. :unsure:

Vin

Legacy Member
Beter idee: ik werk met een Timer (diegene uit javax.swing), die om de x seconden een ActionEvent firet.
In de corresponderende actionPerformed methode haal ik dan de benodigde data op en stuur ik ze door naar het model.
Good thing about Timer is dat je'm kan starten en stopzetten wanneer je maar wil.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan