Hallo. Ich wollte mir eine kurze Benachrichtigung in mein Programm am Anfang einbauen, da der erste Start immer etwas dauert, da viele Resourcen geladen werden müssen. habs erst mit JOptionPane probiert, der erzeugt mir aber immer MOdale DIaloge.
Hab dann versucht die JoptionPane in einen eigenen Thread auszulagern, das hat dann auch funktioniert, aber das Fenster ist einfach weiß geblieben. ALso der Text in dem Dialog war nicht zu sehen, bis die Initialisierung im hauptprogramm fertig war…
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Lade Resourcen. Bitte warten...", "Bitte warten...", JOptionPane.INFORMATION_MESSAGE);
}
}).start();```
Dann hab ich es so versucht:
```// JOptionPane.showMessageDialog(null, "Lade Resourcen. Bitte warten...", "Bitte warten...", JOptionPane.INFORMATION_MESSAGE);
JDialog dialog = new JOptionPane("Lade Resourcen. Bitte warten...", JOptionPane.INFORMATION_MESSAGE).createDialog("Bitte warten...");
dialog.setModal(false);
dialog.setVisible(true);
System.out.println("Weiter");
// initialisierung
dialog.setVisible(false);```
Aber da das selbe: Das Fenster bleibt weiß, bis die Initialisierung fertig ist und dann brauch ichs ja auch nicht mehr... Wieso bleibt das weiß?
kommt darauf wo du dich befindest,
die zweite Variante direkt in eine leere main-Methode eingefügt sollte keine Probleme machen,
bist du dagegen im AWT-Event-Thread, der die GUI steuert, der ActionListener ausführt,
dann wird das Fenster von dort erzeugt (oder auch aus einem parallelen Thread solange der AWT-Event-Thread beschäftigt ist, egal) nur leer angezeigt,
gefüllt erst wenn der AWT-Event-Thread Zeit hat, etwa das Layout durchzuarbeiten,
vielleicht gibt es auch einen manuellen Aufruf…
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() // alles vom AWT-Event-Thread ausführen lassen, grundsätzlich gut gegen Anzeigefehler
{
@Override
public void run() {
new Thread(new Runnable() // allgemein nicht zu empfehlen bei GUI, hier wirds davon nicht besser
{
@Override
public void run() {
JDialog dialog = new JOptionPane("Lade Resourcen. Bitte warten...", JOptionPane.INFORMATION_MESSAGE).createDialog("Bitte warten...");
dialog.setModal(false);
dialog.setVisible(true);
System.out.println("Weiter");
}
}).start();
try {
Thread.sleep(3000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("fertig");
}
});
}
}```
eine Standardlösung dazu habe ich gerade nicht, vielleicht dieser Splashscreen,
manuell muss der AWT-Event-Thread entlastet werden, falls drin erstmal ausklingen, alles in einem separaten Thread,
dort den Dialog öffnen, falls ganz korrekt dann mit invokeLater oder ähnlichem,
falls die Initialisierung danach im parallelen Thread stattfindet sollte es schon laufen, falls diese auch in den AWT-Event-Thread muss,
wie alle GUI-Arbeit wenn man ganz korrekt sein will, dann vorher paar ms (z.B. 200) im parallelen Thread warten, Zeit zum Zeichnen lassen