Blockierender JDialog.

Status
Nicht offen für weitere Antworten.

VipViper2000

Aktives Mitglied
Hey Leute,

ich hab ein "Problem": Und zwar soll in meiner Anwendung bei Druck auf einen Knopf ein neues Fenster aufploppen in welchem man Koordinaten eingeben kann und diese dann mit OK bestätigt. Jetzt sieht mein Klassendesign im Moment so aus, dass ich aus meinem EventManager (die Klasse fängt alle Events ;)) eine Instanz der Klasse MyDialog generiere und anzeigen lasse. Jetzt soll aber (im Prinzip nur aus designtechnischen Gründen) die Klasse EventManager keine Klassenvariable haben, die Referenz zum MyDialog ist. Ich hoffe ihr versteht was ich meine. Also im Prinzip will ich genau den Mechanismus von einem JFileChooser haben: Ich kann ihn anzeigen lassen und der Aufruf JFileChooser.showXXXDialog() blockiert so lang, bis ich "Abbrechen" oder "Open" gedrückt hab. Daraufhin kann ich dann die Daten des JFileChoosers abfragen. Aber beim FileChooser wird das blockieren ja durch die show() Methode hervorgerufen, die ja deprecated ist.

Also: Wie löst ihr sowas? Weil das Problem hatte ich schon bei vielen Anwendungen und hab es immer so gelöst, dass der aufploppende Dialog ein Event im EventManager auslöst. Das führt aber halt dazu, dass der Dialog den EventManager kennen muss und umgekehrt, was IMHO designtechnisch nicht so toll ist.

Helft mir mal ;)

Gruß,
VipViper2000
 
G

Guest

Gast
Das Zauberwort ist "modal".

Siehe: JDialog(Dialog owner, boolean modal)
 

VipViper2000

Aktives Mitglied
Was ein modaler Dialog ist weiß ich sehr wohl. Aber das ist nicht mein Problem. Mir kommt es nicht darauf an, dass erst dieses Fenster geschlossen werden muss, sondern um die Event Verarbeitung beim schließen des Dialogs. Ich möchte praktisch dieses Dialog Fenster aufploppen lassen, der mit einem int-Wert zurückkehrt (genauso wie ein JFileChooser). Das hat den einfachen Vorteil, dass sich die Komponenten nicht gegenseitig kennen müssen. Ist relativ schwer zu beschreiben, aber ich hoffe ihr wisst, was ich meine.
 

nocxsville

Bekanntes Mitglied
Dann mach es doch einfach genaus wie die Chooser.
Also mal schnell dahingeschrieben würde ich das in etwa so machen:

Code:
public final class ValueChooser extends JDialog {

private ValueChosser() { ... }

public static final int showValueChooser() {
   final ValueChooser vChooser = new ValueChooser ();
   vChooser.setVisible(true);
   
   while(vChooser.isVisible()) {} // evtl. im Thread laufen lassen oder eleganter lösen ;)

   return Integer.parsInt(<WERT_IN_KOMPONENTE>);
}

ist zwar jetzt nicht gerade schön, aber soll ja auch nur als Beispiel dienen ;)

Falls es zu Blockierungen kommt, musst du noch einen Thread rum packen.

Gruß,
nocxsville.
 

VipViper2000

Aktives Mitglied
Hmm joa. Also so wie du es machst meine ich es auf jeden Fall. Aber von endlosen while Schleifen halte ich eigentlich gar nix. Ich muss mir den FileChooser nochmal genauer anschauen. Aber trotzdem danke schonmal.
 
G

Guest

Gast
Vergiss das mit den Threads oder Endlosschleifen. Modal ist modal.
Hier ein Beispiel
Code:
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Frame;
import javax.swing.JDialog;

public class MyDialog extends JDialog
{
   private int result;
   
   private MyDialog(Dialog owner, String title)
   {
      super(owner, title, true);
   }

   private MyDialog(Frame owner, String title)
   {
      super(owner, title, true);
   }
   
   private void setResult(int result)
   {
      this.result = result;
   }
   
   private int getResult()
   {
      return result;
   }
   
   private void initContent()
   {
      // Hier Dialoginhalt/Verhalten etc. initialisieren
   }

   private static int showDialog(Component parent, MyDialog dialog)
   {
      dialog.initContent();
      dialog.setLocationRelativeTo(parent);
      dialog.setVisible(true);
      return dialog.getResult(); 
   }

   public static int showDialog(Dialog owner, String title)
   {
      return showDialog(owner, new MyDialog(owner, title));
   }

   public static int showDialog(Frame owner, String title)
   {
      return showDialog(owner, new MyDialog(owner, title));
   }
   
   public static void main(String[] args)
   {
      int result = MyDialog.showDialog((Frame)null, "BlaBla");
      System.out.println(result);
   }
}
 

VipViper2000

Aktives Mitglied
Hey Gast!

Also irgendwie muss ich mich da vertan haben ;). Das geht ganz genauso wie du sagst. Das liegt aber dann anscheinend daran, dass setVisible() blockierend ist, wenn der Dialog Modal ist, oder? Und sobald ich dann setVisible(false) aufrufe, wird der Lock wieder gelöst. Ich hab irgendwie immer Probleme damit, wenn Dinge so einfach sind :D.

Also: Vielen Dank dir ;)
 
G

Guest

Gast
VipViper2000 hat gesagt.:
Hey Gast!

Also irgendwie muss ich mich da vertan haben ;). Das geht ganz genauso wie du sagst. Das liegt aber dann anscheinend daran, dass setVisible() blockierend ist, wenn der Dialog Modal ist, oder? Und sobald ich dann setVisible(false) aufrufe, wird der Lock wieder gelöst. Ich hab irgendwie immer Probleme damit, wenn Dinge so einfach sind :D.

Also: Vielen Dank dir ;)
Das mit dem setVisible(false) stimmt schon, aber du musst da aufpassen, in welchem Zustand
der Dialog beendet wird (Klick auf X, was dann?). Insbesondere bei einem Update-Dialog bzw.
wo das Schliessen an bestimmte Bedingungen geknüpft ist (alle Mussfelder ausgefüllt, eine
Auswahl wurde getroffen etc.).

Hier die Ergänzung
Code:
...
   private void fireCloseEvent()
   {
      // Das hier kannst du als Reaktion auf OK oder Cancel aufrufen
      dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
   }

   private boolean canClose()
   {
      // Hier eine Prüfung der Daten vornehmen und evtl., wenn nötig, 
      // eine Bestätigung vom Anwender einfordern.
      return JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(
               this, "BlaBla?", "Titel", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE
             );
   }
   
   private static int showDialog(Component parent, final MyDialog dialog)
   {
      // Schliessen zuerst mal nicht erlaubt.
      dialog.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
      dialog.addWindowListener(
        new WindowAdapter() {
           public void windowClosing(WindowEvent e) {
              // Wenn Schliessen zugelassen, dann ...ehmmm, schliessen ;-)
              if(dialog.canClose())
              {
                 dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
              }
           }
        }
      );
      dialog.initContent();
      dialog.pack();
      dialog.setLocationRelativeTo(parent);
      dialog.setVisible(true);
      return dialog.getResult(); 
   }
...
 

VipViper2000

Aktives Mitglied
Ja da hast du Recht. Ich hatte das etwas anders gelöst: Ich gebe halt beim Schießen den Int Wert zurück und frage dann im Eventhandler ab, ob alle Daten korrekt eingegeben wurden sind. Aber deine Variante ist natürlich eleganter und ich werd das auch so machen.

Danke dir nochmal.
 

nocxsville

Bekanntes Mitglied
Noch ein Tipp: Schau dir mal die JFileChooser Klasse an. Ist zwar an manchen Stellen ein wenig verwirrend aber darin findest du deine Antworten ;)

Gruß,
nocxsville.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Swing Frage zu jDialog AWT, Swing, JavaFX & SWT 7
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
L Swing JDialog ton beim klicken ausstellen AWT, Swing, JavaFX & SWT 1
L JDialog hat manchmal keinen Inhalt AWT, Swing, JavaFX & SWT 2
Drachenbauer Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge. AWT, Swing, JavaFX & SWT 19
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
B Eingaben im JDialog abwarten AWT, Swing, JavaFX & SWT 4
S Swing JDialog mit KeyEvent als Rückgabe AWT, Swing, JavaFX & SWT 1
O Swing JDialog öffnen und dann warten bis er geschlossen wurde AWT, Swing, JavaFX & SWT 2
stylegangsta JDialog bestimmte Zeilen kursiv AWT, Swing, JavaFX & SWT 20
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
Bluedaishi JDialog modal und JTextArea AWT, Swing, JavaFX & SWT 4
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
T Event Handling JDialog schließen, sobald ein neuer erzeugt wird AWT, Swing, JavaFX & SWT 3
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
D Button auf geöffnetem JDialog AWT, Swing, JavaFX & SWT 5
N Definitionen JDialog AWT, Swing, JavaFX & SWT 7
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
D Swing Schließen von JDialog soll auch JFrame schließen. AWT, Swing, JavaFX & SWT 4
N Swing Fragen zu non-modal JDialog AWT, Swing, JavaFX & SWT 1
F Swing JDialog schließen - WindowListener bekommt dispose nicht mit AWT, Swing, JavaFX & SWT 0
N JDialog als Progress-Anzeige AWT, Swing, JavaFX & SWT 6
M JDialog statt JFrame AWT, Swing, JavaFX & SWT 22
I focus an ein jdialog geben AWT, Swing, JavaFX & SWT 3
3 JDialog über einem Vollbildfenster anzeigen AWT, Swing, JavaFX & SWT 5
M JDialog soll JFrame "blockieren" AWT, Swing, JavaFX & SWT 2
K JDialog zeigt Components nicht an AWT, Swing, JavaFX & SWT 3
S Jframe aus JDialog starten AWT, Swing, JavaFX & SWT 4
M JDialog übergibt eingaben nicht an aufrufende klasse AWT, Swing, JavaFX & SWT 15
S Assistent im JDialog AWT, Swing, JavaFX & SWT 7
H Swing JDialog cannot be resolved as a typ AWT, Swing, JavaFX & SWT 12
C Swing JDialog "flutet" den Arbeitsspeicher AWT, Swing, JavaFX & SWT 9
S Swing Eigenen JDialog mit Rückgabewert AWT, Swing, JavaFX & SWT 3
C Swing JDialog Ladebildschirm wird nicht angezeit AWT, Swing, JavaFX & SWT 5
Jagson Mit JMenu auf jDialog zurück? Wie? AWT, Swing, JavaFX & SWT 8
A JDialog (modal) blockiert alle Fenster! AWT, Swing, JavaFX & SWT 2
Jagson Swing Von JDialog zu anderem JDialog wechseln AWT, Swing, JavaFX & SWT 2
S JDialog direkt über dem MainFrame aufpoppen lassen AWT, Swing, JavaFX & SWT 2
A Swing JDialog KeyBindings und Textfelder AWT, Swing, JavaFX & SWT 5
D Daten von JDialog an JTable in JFrame übergeben AWT, Swing, JavaFX & SWT 7
D JDialog: immer nur einer gleichzeitig AWT, Swing, JavaFX & SWT 4
S JDialog per Button schließen AWT, Swing, JavaFX & SWT 2
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
D JDialog alwaysOnTop, aber nur innerhalb der Applikation AWT, Swing, JavaFX & SWT 3
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
S JDialog über Applet AWT, Swing, JavaFX & SWT 3
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
J Swing JDialog gleichzeitig mit JFrame anzeigen AWT, Swing, JavaFX & SWT 8
S Probleme jDialog einfügen AWT, Swing, JavaFX & SWT 4
qwerqer Swing JDialog Darstellungsprobleme - Dialog lässt sich nicht schließen AWT, Swing, JavaFX & SWT 3
S Schrift ändern in JDialog AWT, Swing, JavaFX & SWT 3
S Problem mit JDialog AWT, Swing, JavaFX & SWT 3
D Elternfenster vom JDialog aktualisieren oder nicht ? AWT, Swing, JavaFX & SWT 7
hdi Swing Genaue Funktionsweise von modalem JDialog? AWT, Swing, JavaFX & SWT 11
U JDialog ohne Taskleiste AWT, Swing, JavaFX & SWT 7
S Programm pausieren während JDialog offen ist AWT, Swing, JavaFX & SWT 2
X JEditorPane Größe in JDialog automatisch anpassen AWT, Swing, JavaFX & SWT 2
Ollek JDialog Koponenten neu anordnen AWT, Swing, JavaFX & SWT 3
A JDialog AWT, Swing, JavaFX & SWT 10
Dit_ SwingUtilities.invokeLater und Modaler JDialog AWT, Swing, JavaFX & SWT 11
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A JDialog ausdrucken AWT, Swing, JavaFX & SWT 7
aze JDialog mit runden ecken AWT, Swing, JavaFX & SWT 8
Dit_ JDialog nur horizontal vergrößern AWT, Swing, JavaFX & SWT 3
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
M Swing Vererbung, Probleme mit JDialog AWT, Swing, JavaFX & SWT 12
H JDialog, Modal - Klassenübergreifend => Problem AWT, Swing, JavaFX & SWT 5
S Swing Bild (Gif) in Bitte warten JDialog AWT, Swing, JavaFX & SWT 6
U JFrame minimiert nach JDialog, JOptionPane AWT, Swing, JavaFX & SWT 3
K Swing JDialog aus Frame ausrufen AWT, Swing, JavaFX & SWT 2
B JDialog über JFileChooser anzeigen AWT, Swing, JavaFX & SWT 6
B JDialog AWT, Swing, JavaFX & SWT 6
J Swing Probmel mit JDialog (Modal/FocusLost/Button) AWT, Swing, JavaFX & SWT 5
E Swing Fehlerhaftes Verhalten bei gleichzeitigen Verwendnen von PopUpMenu und JDialog?! AWT, Swing, JavaFX & SWT 5
J Swing JDialog mit static-Funktion anzeigen -> Rückgabewert AWT, Swing, JavaFX & SWT 3
E Daten von JDialog nach JFrame übertragen AWT, Swing, JavaFX & SWT 4
F ActionListener von JButton funktioniert mit JFrame aber nicht mit JDialog AWT, Swing, JavaFX & SWT 2
D Mehrere Comboboxen in JDialog AWT, Swing, JavaFX & SWT 2
F JDialog per Button schliessen - klappt nicht AWT, Swing, JavaFX & SWT 4
BattleMaster246 JDialog erscheint in der Taskbar AWT, Swing, JavaFX & SWT 7
H Sub-Dialog von modalem JDialog aus aufrufen - geht das? AWT, Swing, JavaFX & SWT 6
R Swing JDialog liefert immer false, 2 JListen verknüpfen AWT, Swing, JavaFX & SWT 3
P Swing eigenen Modalen JDialog AWT, Swing, JavaFX & SWT 6
J JDialog verliert Werte AWT, Swing, JavaFX & SWT 3
N Variablen an JDialog übergeben AWT, Swing, JavaFX & SWT 2
P Swing JDialog schliesst nicht AWT, Swing, JavaFX & SWT 2
X Swing JDialog von JInternalFrames überlappen lassen AWT, Swing, JavaFX & SWT 2
O JDialog-JScrollPane-JTable Problem AWT, Swing, JavaFX & SWT 3
N Swing Frage zu modalem JDialog. AWT, Swing, JavaFX & SWT 16
A JFrame oder JDialog AWT, Swing, JavaFX & SWT 12
B Swing JDialog : Herausfinden wie dieser beendet wurde? AWT, Swing, JavaFX & SWT 2
T JDialog ohne Fenstermanager? AWT, Swing, JavaFX & SWT 2
S JDialog in der Taskbar anzeigen AWT, Swing, JavaFX & SWT 3
A Swing JFrame Werte aus JDialog übergeben AWT, Swing, JavaFX & SWT 4
K Swing JDialog ohne Titlebar mit Rahmen AWT, Swing, JavaFX & SWT 5
KrokoDiehl Swing KeyEvents für JDialog / JFrame AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben