Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] eigen blocking dialog maken

Pagina: 1
Acties:

  • chronozphere
  • Registratie: Juli 2006
  • Laatst online: 16-12-2020
Hoi Java programmeurs,

Ik wil graag een dialog maken die ik kan aanroepen m.b.v een simpele call, zoals:

code:
1
boolean succesfull = showSoundRecordingDialog( < parameters > );


dus voor de duidelijkheid.. deze functie blokkeerd de uitvoer van de calling-code, totdat de gebruiker het dialog weer afsluit. De return-value is dan gebaseerd op de acties van de gebruiker.

Ik weet dat je de modality van een dialog kunt aangeven, wat volgens mij alleen inhoud dat je de andere windows in je applicatie hun input kunt ontzeggen. Dit zegt tot zover ik gezien heb niets over de verdere flow van het programma (het is niet blocking zoals het voorbeeld).

De meeste examples die ik tegen kom over dialogs laten zien dat je je eigen dialog kunt afleiden van JDialog maar geven geen hints over hoe je een blocking dialog kunt maken die m.b.v een call kunt uitvoeren.

Iemand enig idee?

Bedankt!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Ik snap je vraag niet goed?

Als je een JOptionPaneInputDialog oproept bijvoorbeeld, dan stopt de code toch daar totdat er input is gegeven door de gebruiker?

  • michiel_
  • Registratie: Juli 2005
  • Niet online
Als je dit wilt (of dat een goed idee is weer een heel andere discussie), zou je denk ik:

- In de methode een eventlistener setten
- The thread pauseren (Thread.wait())
- de boolean (geset in de listener) returnen

- Vanuit de event listener een boolean field setten
- De thread hervatten (Thread.notifyAll())

Dit allemaal uit m'n hoofd (plus Threading is niet mijn sterkste kant), dus onder voorbehoud van fouten ;).

edit: Ik ben niet helemaal wakker: dit blokkeert natuurlijk ook je mogelijkheid om op de Ja/Nee knoppen van je dialog te drukken. Zou je evt. weer alles in een aparte thread kunnen drukken, maar ik weet niet zeker of dit kan met swing.

[ Voor 21% gewijzigd door michiel_ op 25-02-2011 16:35 ]


Verwijderd

JOptionPane is inderdaad de manier. Dat toont een modal dialog, en het resultaat van de user input krijg je als return value terug. Easy en niks Threads pauzeren

  • chronozphere
  • Registratie: Juli 2006
  • Laatst online: 16-12-2020
Bedankt voor de reacties. :)

Misschien was ik nog helemaal duidelijk over het feit dat ik mijn "eigen" dialog wou maken. Dus zelf een aantal componenten erop zetten en het gedrag verder programmeren.

Ik heb even wat verder gekeken en ik vond het volgende voorbeeld:

ListDialog

Deze code lijkt te doen wat ik wil. Er word een custom dialog opgebouwd in ListDialog.java en deze word m.b.v een enkele call getoond. Ik zat naar de code te kijken en ik snap nog niet helemaal wat er gebeurd. Dit is b.v de method die aangeroepen word om ListDialog te tonen. Deze returned pas als een waarde geselecteerd is. Alleen ik begrijp niet waarom. :?

code:
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
26
27
    /**
     * Set up and show the dialog.  The first Component argument
     * determines which frame the dialog depends on; it should be
     * a component in the dialog's controlling frame. The second
     * Component argument should be null if you want the dialog
     * to come up with its left corner in the center of the screen;
     * otherwise, it should be the component on top of which the
     * dialog should appear.
     */
    public static String showDialog(Component frameComp,
                                    Component locationComp,
                                    String labelText,
                                    String title,
                                    String[] possibleValues,
                                    String initialValue,
                                    String longValue) {
        Frame frame = JOptionPane.getFrameForComponent(frameComp);
        dialog = new ListDialog(frame,
                                locationComp,
                                labelText,
                                title,
                                possibleValues,
                                initialValue,
                                longValue);
       [b] dialog.setVisible(true); //<< Blokkeerd deze call totdat een antwoord geselecteerd is???[/b]
        return value;
    }


Ik snap niet waar het "wachten op userinput" pricies plaatsvind. Als ik naar deze code kijk zou ik denken dat er een dialog aangemaakt wordt, en vervolgens getoond word en dat er DIRECT een waarde geretourneerd wordt.

Kan iemand dit misschien toelichten?

Bedankt!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 27-11 20:39

Gerco

Professional Newbie

ListDialog extends JDialog. De setVisible(true) call blocked dus tot de dialog weer onzichtbaar gemaakt wordt. Dit kun je bijboorbeeld in de javadoc van java.awt.Dialog terugvinden (JDialog extends java.awt.Dialog):
[quote=http://download.oracle.com/javase/6/docs/api/java/awt/Dialog.html#setVisible(boolean)]
Notes for modal dialogs.
• setVisible(true): If the dialog is not already visible, this call will not return until the dialog is hidden by calling setVisible(false) or dispose.
• setVisible(false): Hides the dialog and then returns on setVisible(true) if it is currently blocked.
• It is OK to call this method from the event dispatching thread because the toolkit ensures that other events are not blocked while this method is blocked.


Vanwege, onder andere, dat laatste punt wil je overigens *niet* beginnen aan het zelf repliceren van deze functionaliteit met behulp van threads, wait() en notify(). Het kan natuurlijk wel, maar er zitten enorm veel haken en ogen aan die ze bij Sun/Oracle allemaal al voor je hebben opgelost.

Gewoon je eigen dialog extenden van JDialog dus, zoals de documentatie je netjes voorschrijft en de voorbeelden laten zien.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • chronozphere
  • Registratie: Juli 2006
  • Laatst online: 16-12-2020
Bedankt! Tis weer helemaal duidelijk. :)
Pagina: 1