[Java] Modal Window die code uitvoert

Pagina: 1
Acties:

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Ik zit met ik dacht een heel simpel probleem.

ergerns in mijn Swing app wil ik bijvoorbeeld iets uitvoeren maar terwijl dat uitgevoerd moet er soort popup verschijnen. Er hoeft geen feedback te zijn en het is Modal. Dus dacht ik

Java:
1
2
3
4
5
JWindow tWindow = new JWindow();
//make it pretty
tWindow.visible(true);
//executecode
tWindow.dispose();


Maar nu vertikt die (rotte) Swing om die dialog volledig te tekenen en ik krijd dus niets ander dan een window border met daarin garbage. Net voordat de execute gedaan is refreshed ie het scherm en verdwijnt dan. Ik wil dus zeker zijn dat het visible is voordat de code wordt uitgevoerd.

Ik op zoek naar een 'flush' van de event thread, maar die bestaat blijkbaar niet. (dus dwz ik zou een sorrt van Swing.processAllPendingEvents()). Lollig.

Goed niet getreurt: waarom geen Dialog zelf maken en daarin dan de code uitvoeren. Probleempje: als ik the windowopen event daar de execute zet doet ie net hetzelfde maw de windowopened wordt gedaan VOOR ie getekent wordt. Een message om te weten wanneer ie nu getekent is niet gevonden.

Niet getreurt (wel pisnijdig al) ik zal dan maar een Thread starten in de windowopened dan gaat ie vast werken. Noppes zware crashes als gevolg. Zelfs met swing...invokeLater geprobeert maar NIETS werkt- ben ik nou een idioot maar hoe in godsnaam kan ik dit simpele probleem oplossen. (ik heb al eens gebruik gemaakt vaan een Timer met 100 ms wait en die werkt wel, maar om nu letterlijk even te gaan wachten (wie weet wat ie op een andere machine doet) is belachelijk). Gek genoeg heb ik dus een splash-screen inhet begin van mijn programma en daarvoor heb ik niets moeten doen om dat te laten werken...

Heb al heel wat gegoogled maar alleen invokeLater (wait kun je dan weer niet gebruiken) gevonden...

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

Alarmnummer

-= Tja =-

Als jij een modal window aan hebt, dan zal al de code die na het visible maken van de window niet uitgevoerd worden, totdat het window is gesloten.

ModalWindow w = new ModalWindow();
w.setVisible(true);
System.out.println("blaat");

Je krijg pas blaat te zien, als w weer gesloten wordt.

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Heb zoiets ook een keer gedaan dmv SwingWorker class. Eerst dialog creeeren en displayen, dan
Java:
1
2
3
4
5
final SwingWorker worker = new SwingWorker() {
    public Object construct() {
        return new RekentveelUitClass();
    }
};

In die rekentveeluitclass doe je dan het echte rekenwerk. Wel zorgen dat je daar om de zoveel tijd Thread.sleep() aanroept, anders kan je GUI niet hertekenen.

Edit: Bedenk me net, dit is niet modal, maar gewone dialog.

[ Voor 13% gewijzigd door SWfreak op 23-03-2003 14:23 ]


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
hmm die JWindow is niet modal dus die blockt ook niet de code - maar hij update de gui niet pas nadat de execute gedaan is. Ik heb in theories helemaal geen threads nodig omdat ie wel degelijk mag blocken.

open een window / frame / wahetevre
zeker van zijn dat de window wel degelijk visible is (? blijkbaar onmogelijk)
do code
sluit window
...

ZO simpel - ik snap dus ook niet waarom mijn splash wel werkt en dit niet. (net hetzelfde) het gaat me enkel en alleen om het flushen van de Event thread voordat ie de code uitvoert. Met SwingWorker zal wel gaan maar dan word ie net Non-Modal. De user mag dus niets doen totdat het gedaan is. Maar blijkbaar is dit weer te moeilijk (of te gemakkelijk) voor de Swing Design people... sigh...

als ik invokeLater wil doen (die naar het schijnt de UI events' flushed') dan moet dat in een thread die natuurlijk weer niet blocked. De code moet dus helemaal niets aan UI spul doen gewoon venstertje openen , code, sluiten en dit allemaal in de 'main' loop. Als ik geforceerd wordt om thread and workers te gaan gebruiken (en dus mogelijk problemen met User die effe snel nog iets anders doet) is dat toch te gek???

edit: het enige verschil is
dat de execute met mijn splash is de main-thread zit en deze keer in de AWT-Event engine. ik zal dus de hele code ergens anders moeten zetten... ziekelijk. Wie maakt er een event engine die je niet kunt flushen???

[ Voor 11% gewijzigd door hobbit_be op 23-03-2003 14:48 ]


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
heb het denk ik opgelost dus voor de geinteresseerde:

maak een modal dialog.
add a windowlistener
op de windowactivate start een thread
daarin doe je dit:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
EventQueue tEventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
                    ooTimer tTimer = new ooTimer();
                    tTimer.restart();
                    int c = 0;
                    while (tTimer.peek() < 10.0)
                    {
                        Thread.currentThread().sleep(10);
                        if (tEventQueue.peekEvent() == null)
                        {
                            //logger.debug("no events left after "+c +"attempts");
                            break;
                        }
                        c++;
                    }


deze wacht totdat the event queue leeg is of dat er meer dan 10 seconden voorbij is

dan daarna
Java:
1
SwingUtilities.invokeAndWait(new dkitRunnable(mPopup));


dan in die runnable doe je de code + een dialog.dispose() nadat die is afgelopen...

zo krijg ik altijd eerst het window te zien voordat ie de code uitvoert. Ziek.

alleen ben ik niet 100% zeker dat je getSystemEventQueue zonodig de juiste doorgeeft - ik denk it dan volledige op alle messages wacht... denk dus - wel lekker zo programeren waar je denkt dat iets werk...

ik kom dus terug op m'n vorige post: Swing zuigt dus wel... dit zit in elke GUI waarmee ik ooit heb gewerkt...

edit:
het is dus onmogelijk aan de huidide event-queue te geraken want die is private package - OENEN!!!

[ Voor 5% gewijzigd door hobbit_be op 23-03-2003 16:32 ]