JOptionPane ohne Klick-Aufforderung

dalco

Aktives Mitglied
hallo,
ich starte mit einem button eine relativ lang dauernde datenbankabfrage, wenn sie fertig ist lass ich ein JOptionPane anzeigen mit "Daten fertig" , auf OK klicken und man weiß das alles fertig ist.

nun möchte ich gern beim button klicken ein JOptionPane auf machen, das sofort anzeigt "Aktualisiere Daten..." und während des vorgangs stehen bleibt, ist alles fertig so sollte sich der text wieder ändern in "Daten fertig", so weiß man, dass was passiert.

habt ihr eine idee dazu oder eine alternative dem user während des laden etwas anzuzeigen, dass was geladen wird, hab hier gelesen, das es was mit busypainter gibt, sieht gut aus, funktioniert aber nicht.

danke für eure antworten
mfg
tino
 
BusyPainter ist eine Klasse aus SwingX, kommt also nicht mit der Standard-Java API. Du müsstest daher das SwingX-Paket herunterladen und in dein Projekt einbauen.

Wenn du sagst, dass etwas nicht geht, musst du auch beschreiben, was genau nicht funktioniert. Eine Fehlermeldung wäre toll!

Es gibt verschiedene Ansätze. Du solltest auf jeden Fall die DB-Abfrage in einem eigenen Thread durchführen.
 
das mit dem busypainter will ich nicht, hatte die jar-dateien schon geladen, aber egal...
ich möchte eben in diesem kleinen optionpane letztlich die sachen optisch anzeigen die beim test im eclipse unten in der console mit sysouts angezeigt werden:
reihenfolge:
1. "starte"
2. zeigt die sysouts an......
3. wenn alles fertig ist -> "fertig"

ich denke das problem ist, dass das java zu langsam ist, er macht es, aber die paint methoden der optionpane sind zu langsam, es kommt gar nicht dazu und zeigt erst am ende dann das "fertig" an
gruss tino
 
ich denke das problem ist, dass das java zu langsam ist, er macht es, aber die paint methoden der optionpane sind zu langsam, es kommt gar nicht dazu und zeigt erst am ende dann das "fertig" an
Uhh... da lehnst du dich aber verdammt weit aus dem Fenster! 😱
Java ist dafür nicht zu langsam. Java ist in etwa so schnell wie C++, man hat schon auch 3D-Spiele in Java geschrieben, auch wenn Java dafür nicht so geeignet ist.

Du hast nur noch nichts über den Mechanismus des Zeichnens in Java gehört oder ihn nicht verstanden.
All deine Änderungen an der GUI müssen im EDT (Event Dispatch Thread) gemacht werden. Der EDT ist quasi eine Warteschlange, in der nacheinander Events und Zeichenoperationen abgearbeitet werden.

Diese Fragen wurden schön öfter hier behandelt, beispielhaft dafür dieser Thread, in dem Marco13 das ganz gut erklärt: http://www.java-forum.org/java-basics-anfaenger-themen/104826-habe-synchronisationsproblem.html

Dann gibts jetzt nach was zum Lesen und Verstehen: Threads and Swing
 
hallo,
dank dir, du hast recht, so tief stecke ich nicht in der materie, mit langsam will ich eben das sagen, dass das paint eben erst nachdem der rest durchgelaufen ist ausgeführt wird.
leienhaft bräuchte ich eben sowas wie einen listener, der sieht: aha paint wurde korrekt dargestellt, jetzt mach die berechnungen und danach zeige fertig an.

werd mir die threads mal ansehen
mercy tino
 
hallo nochmal,
ich weiß nicht wie ich dem Event Dispatch Thread nun sage: erst wenn das kleine fenster komplett sichtbar ist, dann mach alle rechnungen, etc un dann den rest.
vereinfacht siehr es so im frame aus:

Java:
public void start() {
ModelessPane mypane = new ModelessPane("Daten werden aktualisiert...");

db.connectToDatabase();
			   con = db.getConnection();
			   update.countEntries(con , "SELECT * FROM kletterwaende");
			   update.getWallData(con , "SELECT id,wall,name,land,zone,region,gebiet,routen,bildname,anzahl,geoLaenge,geoBreite FROM kletterwaende");
			   anzWalls = update.getData();
db.close();

dann werden alle rechnungen, speichern, auslesen, etc gemacht..............
und zum schluss angezeigt >
mypane.setText("Berechnung des\naktuellen Wände-Rankings\n\nErfolgreich beendet!", true);
}

das ModelessPane mypane ist eben dieser kleine frame, der in der mitte des bildschirms sichtbar ist während die daten bearbeitet werden, nur leider kommt er nicht zum zug, da die berechnungen schneller sind 🙁
wenn ich es richtig verstanden habe müsste der Event Dispatch Thread meine zeile 1
"ModelessPane mypane = new ModelessPane("Daten werden aktualisiert...");"
checken, wenn die angezeigt wird, weitermachen.
aber ich weiß nicht wie ich das thread-mäßig oder so abchecke.

danke und schönen abend noch
tino
 
Wo genau machst du den dieses Panel sichtbar ?

In welchem Thread führst du diese Methode start aus ?
Wenn das als Reaktion auf einen Eventlistener ausgeführt wird, sprich z.B. durch einen Button ausgelöst wird, so musst du es in irgendeinen anderen Thread verschieben.
 
hallo,
naja ausgeführt wird es in einem Jmenu-button mit einem actionlistener, sowas wie "Starte Aktualisierung", in dieser klasse habich aber garnichts mit threads programmiert, einfach runtergetippt, die sachen laufen ja eben, ich dachte nicht, dass das soooo ein problem sein kann, eben dieses kleine pane anzuzeigen bevor die eigentliche aktualisierung beginnt.
wenn ich jetzt dafür in 17 anderen klassen alles mit threads machen muss um dies zu schaffen, dann verzichte ich auf das kleine fenster, ich dachte hier posted einer ein try/catch oder so dafür und die sache geht
danke euch allen
tino
 
danke euch allen nochmal,
habe es jetzt profisorisch mit einem banalen thread.sleep() hingekommen.
über die ganze thread-geschichte an sich muss ich noch mehr lernen.
mercy
tino
 

Neue Themen


Zurück
Oben