modaler Dialog reagiert nicht... (wie ichs gerne hätte!)
-
Hi zusammen!
Ich habe einen modalen Dialog, sobald ich setVisible aufrufe hört dieser und die gesamte Klasse auf zu reagieren!
Als Beispiel mache ich sowas in der Art:
System.out.println("TEST1"); this.setVisible(true); System.out.println("TEST2");
Ich verstehe jetzt auch gut, daß der Rest der Anwendung angehalten wird, aber:
Scheinbar blockiert ein modaler Dialog bei Aufruf von setVisible auch die Ausführung von sich SELBST! ...Und das finde ich schon etwas merkwürdig, da es z.B. in VC++ nicht so ist!Daher meine Frage: (mehr oder weniger)
Wie mache ich einen modalen Dialog, der seine EIGENE Ausführung nicht blockiert?????Würde mich sehr über eine Antwort freuen, da das wegen einem Release drängt!
Viele Grüsse,
Tobias Schenk
-
so ganz verstehe ich dein problem nicht.
wenn ich will, daß ein hauptfenster blockiert, wenn der dialog aufgerufen wird, setzte ich den konstruktor auf true.
die ausführung des dialogfeldes wird aber nicht blockiert, egal ob ich ihn auf true oder false setzte.. hmm
import java.awt.*; import java.awt.event.*; class myDialog extends Dialog implements ActionListener { boolean result; public myDialog(Frame hauptfenster) { super(hauptfenster, " ", true); //<--konstruktor mit true: hauptfenster abhängig von dialog setBackground(Color.red); setLayout(new BorderLayout()); setResizable(false); add("Center", new Label("wirklich beenden?")); Panel panel = new Panel(); panel.setLayout(new FlowLayout(FlowLayout.CENTER)); Button button = new Button("Ja"); button.addActionListener(this); panel.add(button); button = new Button("Nein"); button.addActionListener(this); panel.add(button); add("South", panel); pack(); } public void actionPerformed(ActionEvent event) { result = event.getActionCommand().equals("Ja"); setVisible(false); dispose(); } public boolean getResult() { return result; } } public class FensterMitDialog extends Frame implements ActionListener { public static void main(String[] args) { FensterMitDialog wnd = new FensterMitDialog(); wnd.setVisible(true); } public FensterMitDialog() { super("FensterMitDialog"); setLayout(new FlowLayout()); setBackground(Color.lightGray); Button button = new Button("Ende"); button.addActionListener(this); add(button); setLocation(100,100); setSize(300,200); setVisible(true); } public void actionPerformed(ActionEvent event) { String cmd = event.getActionCommand(); if (cmd.equals("Ende")) { myDialog dlg=new myDialog(this); dlg.setVisible(true); if (dlg.getResult()) { setVisible(false); dispose(); System.exit(0); } } } }
ansonsten false.
-
Moin,
bei meinem java programm passiert das genauso wie du beschrieben hast.
Wenn ich das gleiche aber mit VC und der MFC mache ist das Verhalten aber genauso.
Wie machst du denn das Dialog in c++ modal?
Mein Code:
import java.awt.*; import javax.swing.*; class Jo extends JDialog { Jo(JFrame frame) { super(frame, "Dialog", true); setBounds(100,100,200,200); } } public class My3 extends JFrame{ My3() { super("Frame"); setBounds(100,100,50,50); setVisible(true); Jo ne = new Jo(this); System.out.println("Hallo1"); ne.setVisible(true); System.out.println("Hallo2"); } public static void main(String[] args) { new My3(); } }
und das C++ Programm:
void CHtmlEditApp::OnAppAbout() { CAboutDlg aboutDlg; TRACE("Hallo1\n"); aboutDlg.DoModal(); TRACE("Hallo2\n"); }
Daher meine Frage: (mehr oder weniger)
Wie mache ich einen modalen Dialog, der seine EIGENE Ausführung nicht blockiert?????Mmm, wenn es Modal sein muss könntest du das Dialog in einem Thread öffnen.
-
Ein modaler Dialog blockiert nicht sich selbst. Womöglich haste irgendwo eine Schleife drin, die das ganze bewerkstelligt.
-
setVisible auch die Ausführung von sich SELBST
ich glaub er meinte die Funktion wo das Dialog aufgerufen wurde.
-
nein ich hatte es misverstanden
könnt alle post von mir ignorieren
-
Ich tippe mal darauf, dass Du den Dialog modal machst, damit du im Hintergrund irgendetwas tust, was halt lange dauern kann.
Da Dein modularer Dialog und das, was getan werden soll, nicht in getrennten Threads laufen, würde somit die gesamte Anwendung nicht mehr reagieren, bis das was du tust, beendet ist.
Jedenfalls ist ein normaler Modaler Dialog normalerweise nicht blockiert, sobald man ihn visible macht.
Ansonsten solltest Du mal mehr drum herum erzählen.
-
Hi, mach ich doch gerne!
Also zuerst Infos zu meinem Dialog:
Der Dialog dient dazu einige Daten einzulesen und dazu eine Fortschrittsanzeige anzuzeigen. Das Dateneinlesen alleine klappt 100%ig, habe ich auch schon getestet! Im Konstruktor des Dialog-Feldes werden die Variablen initialisiert (also z.B. Progressbar, etc..). Unter anderem steht im Konstruktor dieser Aufruf der "Chef"-Methode:super(new Frame(), "Start...", true);
...also ein modaler Dialog...
Ist das mit dem Konstruktor gegessen, so wird gleich danach eine Methode "start" aufgerufen, die so aussieht (GENAU SO!):
public void start(Point loc) { this.setSize( 300,120 ); this.setLocation( loc ); this.setResizable(false); System.out.println("VORHER"); this.setVisible(true); System.out.println("HINTERHER"); readDS(ds,cDir); }
Wobei in readDS die DB eingelesen wird. VORHER wird ausgegeben, HINTERHER nicht mehr... ichglaube nicht, daß ich da zwischen eine Endlosschleife habe, würde mich aber über JEDE Hifle freuen!
Viele Grüsse,
Tobias
-
Hmm... ok jetzt seh ich das Problem auch
setVisible(...) genauso wie show() blockieren die Anwendung, damit man nach dem Schliessen des Dialoges sein Ergebnis auswerten kann.dialog.show(); if(dialog.getResult()){ ... }
Evtl. könnte man das was du da tust und den Dialog in getrennten Threads laufen lassen. Ob das funktioniert weiss ich auch nicht genau
Aber versuchen würde ich es zumindest.
Notfalls müßte man sich halt einen "eigenen" Dialog schreiben mit einem JFrame, der halt nicht blockiert.Viel Glück,
MfG Ingo
-
Hi, das mit den Threads hab ich auch schon versucht, hat aber nicht geklappt!
Wie wäre das denn anzustellen, einen Dialog von JFrame abzuleiten, der zwar Modal ist, also "wartepflichtig", aber nicht blockiert???
Gruß, Tobias