Beste PRGers,
momenteel ben ik met een GUI-applicatie in Java bezig.
Het is een "domme" applicatie, dat wil zeggen, middels xml-rpc haalt de GUI alle informatie op van de server.
Omdat sommige responses langer dan "instant" duren, kan de gebruiker de indruk krijgen dat de applicatie niet reageert.
Om dit gevoel weg te nemen, leek het me de beste oplossing om een JDialog met een JLabel, Icon ofzo weer te geven, met daarin de melding dat de applicatie bezig is met het verwerken van het verzoek.
Dit heb ik momenteel voor elkaar op de volgende manier:
Omdat ik op een tiental plekken een dergelijke "Please wait" dialog wil weergeven en er telkens een andere functie aanroepen met return types nodig zijn, wil ik de doInBackground() graag lokaal definiëren.
Echter staat nu de JDialog inline, terwijl ik die graag asynchroon zou willen openen vanuit een aparte klasse.
Daarnaast is de JDialog door de Modal eigenschap nu ook nog blocking, terwijl hij dat ook niet moet zijn.
Voorbeelden op het internet (deze bijvoorbeeld) geeft de volgende "oplossing".
Dit stukje voorbeeldcode doet al bijna wat ik wil, alleen zou ik graag een lokale functie als doInBackground() willen aanroepen, maar ik zou niet weten hoe ik een functiepointer (zoals dat in c eenvoudig kan) mee kan geven als hook van de SwingWorker.
Ik hoop dat het een beetje duidelijk is
Matis
momenteel ben ik met een GUI-applicatie in Java bezig.
Het is een "domme" applicatie, dat wil zeggen, middels xml-rpc haalt de GUI alle informatie op van de server.
Omdat sommige responses langer dan "instant" duren, kan de gebruiker de indruk krijgen dat de applicatie niet reageert.
Om dit gevoel weg te nemen, leek het me de beste oplossing om een JDialog met een JLabel, Icon ofzo weer te geven, met daarin de melding dat de applicatie bezig is met het verwerken van het verzoek.
Dit heb ik momenteel voor elkaar op de volgende manier:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| JDialog dialog; /* Initialiseer dialog en zorg dat Modal true is en geen actionhandlers */ final SwingWorker<Object, Object> worker = new SwingWorker<Object, Object>() { @Override protected Object doInBackground() throws Exception { try { /* Simmuleer een lange reques * Normaal staat hier telkens andere xmlrpc verzoeken met andere parameters en return types. */ Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } dialog.dispose(); return null; } }; worker.execute(); dialog.setVisible(true); |
Omdat ik op een tiental plekken een dergelijke "Please wait" dialog wil weergeven en er telkens een andere functie aanroepen met return types nodig zijn, wil ik de doInBackground() graag lokaal definiëren.
Echter staat nu de JDialog inline, terwijl ik die graag asynchroon zou willen openen vanuit een aparte klasse.
Daarnaast is de JDialog door de Modal eigenschap nu ook nog blocking, terwijl hij dat ook niet moet zijn.
Voorbeelden op het internet (deze bijvoorbeeld) geeft de volgende "oplossing".
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| class SwingWorkerCompletionWaiter extends PropertyChangeListener { private JDialog dialog; public SwingWorkerCompletionWaiter(JDialog dialog) { this.dialog = dialog; } public void propertyChange(PropertyChangeEvent event) { if ("state".equals(event.getPropertyName()) && SwingWorker.StateValue.DONE == event.getNewValue()) { dialog.setVisible(false); dialog.dispose(); } } } JDialog dialog = new JDialog(owner, true); swingWorker.addPropertyChangeListener( new SwingWorkerCompletionWaiter(dialog)); swingWorker.execute(); //the dialog will be visible until the SwingWorker is done dialog.setVisible(true); |
Dit stukje voorbeeldcode doet al bijna wat ik wil, alleen zou ik graag een lokale functie als doInBackground() willen aanroepen, maar ik zou niet weten hoe ik een functiepointer (zoals dat in c eenvoudig kan) mee kan geven als hook van de SwingWorker.
Ik hoop dat het een beetje duidelijk is
Matis
If money talks then I'm a mime
If time is money then I'm out of time