Wartefenster einblenden

bemar

Mitglied
Hallo,

ich bin wieder mal am kniffeln.
Ich habe einen JDialog in dem ich auf Knopfdruck (JButton) eine Datenbankabfrage mache und eine JTable fülle. Jetzt möchte währenddessen einen kleinen undecorated JDialog anzeigen der solange stehen bleibt, bis die DB Abfrage fertig ist. In dem Wartefenster ist eigentlich nur ein JLabel auf dem "Bitte Warten" steht.

Bisher habe ich leider nur geschafft, den Dialog anzeigen zu lassen wenn die Abfrage schon vorbei ist obwohl ich den Wartedialog als eigenen Thread starte.

Was läuft das schief? Wie muss ich den Dialog starten?

PHP:
 mButtonDbOptQuery.registerKeyboardAction(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                WaitWindow ww = new WaitWindow();
                 Thread t = new Thread (ww)
                 t.start();
                 onLoadOptionEntity();
                 t.stop();
            }
        },

PHP:
public class WaitWindow extends JDialog implements Runnable{

    private JPanel contentPane = new JPanel();
    private JLabel label = new JLabel("Bitte warten");

     public WaitWindow(){
         add(contentPane);
         contentPane.add(label);
         setSize(400,200);
         setUndecorated(true);
         setModal(false);
         setLocationRelativeTo(null);
     }

     public void run(){
         pack();
         setVisible(true);
         //try{
         //   Thread.sleep(1000);
         //}catch (Exception e){}
         //stop();
    }

    public void stop(){
        dispose();
    }

    public static void main(String[] args){
        WaitWindow ww = new WaitWindow();
        Thread t = new Thread (ww);
        t.start();

    }
}

Gruß Ben
 
Vermutlich blockiert die Datenbankoperation den Start des Threads. Die muss auch in einen eigenen Thread, ansonsten wird Dein Dialogthread erst nach Beenden der DB-Queries gestartet.
 
Du hast recht. Wenn ich das ganze wie folgt ausführe klappt es.
Ist immer wieder ein gefickel mit dem AWT.
Muss mir wohl mal SWT anschauen ....

Danke für deinen Tipp.

PHP:
mButtonDbOptQuery.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                final WaitWindow ww = new WaitWindow();
                Thread t = new Thread (ww);
                t.start();
                new Thread() {
                    public void run() {
                        onLoadOptionEntity();  // DB Abfrage
                        ww.stop();
                    }
                }.start();

                //ww.stop();
            }
        });
 
Zuletzt bearbeitet:
Kann es sein, das diese InnerThread Lösung ein Hack ist?
Meine Datenbankabfrage braucht nun mind. die 5fache Zeit.

Wenn ich WaitWindow Geschichte ausbaue und die Abrage im GUI Thread laufen lasse ist alles wieder so schnell wie vorher.

Gruß

Ben
 
Oder wenn du es lieber nativ hast, verwende SWT;) Aber AWT ist doch schon steinalt, oder nicht?^^
 
Da geb ich euch recht.
Ich fang jetzt aber kurz vor Ende des Projekts nicht nochmal das Umstellen an.

Außerdem hab ich ja schon eine Lösung.

Ich starte das WaitWindow in einem eigenen Thread im Init des BasisFensters und gebe ihm mein BasisFenster
als Objekt mit. In meinem Basisfenster hab ich ein boolean, in dem ich ihm sag, wann
ich ein WaitWindow haben will und wann nicht.

Im WaitWindow, das ja immer Läuft frage ich ständig diese Variable ab und steuer
das ganze über setVisible.

Ha! Jetzt lobt mich mal ;-)
 
Zuletzt bearbeitet:
Ich finde, dass das doch sehr viel Rechenaufwand ist für ein kleines Wartefenster aber naja^^
 
Zurück