JDialog wird nicht korrekt angezeigt

bernd00

Mitglied
Hallo zusammen,

leider bin ich bei der Forensuche und Google nicht fündig geworden :(. Vielleicht hat jemanden einen Tip für mich oder kann mir sagen was ich falsch gemacht hab.

Also, wollte für mein Programm einen JDialog anzeigen lassen während das Programm längere Zeit arbeitet. Nichts wildes, erstmal nur einen Text "Bitte warten". Das funktioniert auch fast, aber der JDialog wird geöffnet, zeigt nichts an (ist eher Transparent) und wird dann wie geplant geschlossen. Wenn ich den nicht schließen lasse, dann wird der korrekt dargestellt, aber erst wenn der eigentliche Prozess fertig ist.

Bin ich damit total auf dem falschen Weg?

Dazu habe ich eine Klasse LadeDialog erstellt, die den Dialog anzeigt.
Der Konstruktor sieht so aus:
Code:
public LadeDialog() {
  initComponents();
  setVisible(false);
  setResizable(false);
  setLocationRelativeTo(null);
}
(erstellt in Netbeans)
Wenn ich den Dialog ganz normal öffnen lasse funktioniert alles und das JLabel wird auch angezeigt. Natürlich wird auch setVisible(true) gesetzt.

Dann hab ich noch eine Klasse process geschrieben, die einen Thread startet und dabei den JDialog öffnen soll:
Code:
public class process {

    LadeDialog ld = null;
    boolean running = false;

    public process() {
        ld = new LadeDialog();
    }
    public void run() {
        Thread th = new Thread() {
            @Override
            public void run(){
                if(running == false) {
                    ld.setVisible(true);
                    running = true;
                }
            }
        };
        th.start();   
    }
    public void closeDialog() {
        ld.dispose();
    }
}
die Methode heißt run, weil ich erst versucht hab von Thread abzuleiten, aber das bringt dasselbe Ergebnis.

So, dann versuche ich das so im Programm aufzurufen:
Code:
   // wenn etwas laenger dauert, soll das funktionieren
   process p = new process();
   p.run();
   // ... hier ist ganz viel, was gaaaanz lange dauert, oder so ähnlich
   // wenn das fertig ist, dann soll der Dialog wieder verschwinden...
   p.closeDialog();

Würde mich über eine Antwort freuen :)

MfG
 
Hi
Dein Problem liegt darin, dass der Thread, den du startest, das Fenster anzeigt. Man sollte aber von fremden Threads nicht auf Swing-Componenten zugreifen und diese verändern (wegen Threadsicherheit: deswegen steht auch in fast allen Swing-Klassen "Warning: Swing is not thread safe. For more information see Swing's Threading Policy." mit dem Link auf http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html in den unteren Bereich.

Warum öffnest du das Fenster eigentlich in diesem Thread? mach das doch vorher!
 
Hey,
Danke für die Antwort, das wusste ich noch nicht.

Wie meint du das öffnen? Der dialog ist doch bereits offen, nur noch nicht schtbar, der thread macht den nur sichtbar. Wenn das nicht in einem sep. Thread gemacht wird bleibt der dialog doch komplett weg unsichtbar, er würde erst angezeigt wenn das programm fertig ist, dann soll der aber schon nicht mehr sichtar sein. Sondern nur, während das programm etwas durchführt, bzw. wenn ich festlege, dass bei diesem ladevorgang etws angezeigt werden soll.

Denke ich da falsch?
 
Spontan würde ich es mal andersrum versuchen - lass das Programm in einem anderen Thread laufen, und öffne die Dialogbox ohne.
 
Sorry, war etwas unklar formuliert meinerseits. Ich meine du sollst setVisible(); nicht in dem Thread ausführen, sondern bevor du ihn erzeugst.
 
Pasukaru hat gesagt.:
Spontan würde ich es mal andersrum versuchen - lass das Programm in einem anderen Thread laufen, und öffne die Dialogbox ohne.
Kling interessant, aber dafür müsste ich an allen Stellen wo der Dialog angezeigt werden soll Neue Threads erzeugen. Und der Thread müsste beim beenden den Dialog noch schließen?

genodeftest hat gesagt.:
Sorry, war etwas unklar formuliert meinerseits. Ich meine du sollst setVisible(); nicht in dem Thread ausführen, sondern bevor du ihn erzeugst.
ahso. Ja, das hab ich schon probiert. Das Ergebnis ist, dass der Dialog komplett angezeigt wird, aber das Programm nicht weiterläuft, erst wenn ich den Dialog selbst schließe läuft das Programm an dieser Stelle weiter.

Wenn das nicht funktioniert, habt ihr evtl. eine Idee wie man sonst den Benutzer klarmachenkann dass etwas passiert und er nicht rumklicken soll?
 
Kling interessant, aber dafür müsste ich an allen Stellen wo der Dialog angezeigt werden soll Neue Threads erzeugen. Und der Thread müsste beim beenden den Dialog noch schließen?

Genau - ist vielleicht etwas umständlicher - aber ich glaube die Sinnvollste Möglichkeit. Wie du richtig gesagt hast, müsste der Dialog am Ende des Threads beendet werden.

ahso. Ja, das hab ich schon probiert. Das Ergebnis ist, dass der Dialog komplett angezeigt wird, aber das Programm nicht weiterläuft, erst wenn ich den Dialog selbst schließe läuft das Programm an dieser Stelle weiter.

Ja, das Problem ist, dass der Thread, in dem der Dialog anzeigt wird, so lange "einfriert" bis dieser wieder geschlossen wird. Ich hatte mal ein ähnliches Problem mit einem ServerSocket. Dort wurde auf eine eingehende Verbindung gewartet - und solange keine kam, war die GUI nicht bedienbar.
 
Zuletzt bearbeitet:
Zurück