Anzeige von JTextField erneuern

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen,

ich habe folgendes Problem:

Code:
textField.setText("Receiving data...");
database.execQuery("SELECT * FROM Tabelle");
textField.setText("Received data.");

Ich gebe eine Meldung aus, führe eine Datenbank-Anfrage durch (die einige Sekunden dauert) und gebe danach eine weitere Meldung aus. Leider wird nur die letzte Meldung ausgegeben.

Weder invalidate(), validate(), revalidate(), repaint(), doLayout() etc. haben mir geholfen. Wie kann ich Swing dazu bewegen, das Textfeld *sofort* zu zeichnen?

Gruß,
AMiGA
 
wahrscheinlich wird die meldung ausgegeben und dann direkt überschrieben. und du bekommst es nicht mit weil es zu schnell geht.

du könntest das mit JOptionPane testen.
 
wahrscheinlich wird die meldung ausgegeben und dann direkt überschrieben. und du bekommst es nicht mit weil es zu schnell geht.

du könntest das mit JOptionPane testen.

Wie gesagt, die Datenbank-Anfrage dauert einige Sekunden. Erst nach der Abfrage wird eine Meldung ausgegeben.

Wenn ich folgendes mache wird die Meldung sofort ausgegeben:

Code:
textField.setText("Receiving data..."); 
JOptionPane.showMessage(null, "Test");
database.execQuery("SELECT * FROM Tabelle"); 
textField.setText("Received data.");

...daher denke ich, dass ich nach dem "setText" noch ein Erneuern erzwingen muss, ich weiß nur leider nicht wie.

Gruß,
AMiGA
 
du hast nicht zufällig alle 3 befehle im eventdispatchthread hinternander stehen?
 
du hast nicht zufällig alle 3 befehle im eventdispatchthread hinternander stehen?

Öh... mach mich nicht schwach... meine Anwendung besteht bislang nur aus zwei Threads, wobei ein Thread einen Timer realisiert (mittels wait(zeit)). Ansonsten habe ich eigentlich alles in einem Thread realisiert, sowohl die GUI als auch den DB-Zugriff. Oder verstehe ich irgend etwas vollkommen falsch?

Gruß,
AMiGA
 
wenn ichs richtig verstehe, du möchtest, dass im textfeld die meldung a sagma "bin-laden" steht ^^ und wenn fertig diese dann mit "habe fertig" überschrieben wird!
...nur klappt das nicht, weil die erste nicht angezeigt wird!?

wenn ja, dann hilft da nur noch die db-anfrage in einem separaten thread zu starten! dieser kann on-the-fly auch erzeigt werden und ER muß dann wenn er fertig ist, das txt-feld überschreiben!

d.h.:
1. schreibe "bin laden"
2. erzeuge + starte thread (dem thread die ref. zum txtfeld übegeben)
3. thread fertig, thread kenn txtfeld und schreibt rein "feddich"
wichtig: nix mit wait oder sleep bei GUI, sonst wieder problemme ^^
 
Ohne Multi-Threading habe ich keine Chance? Ich wollte das eigentlich vermeiden und die Kommunikation mit der DB synchron realisieren.
 
Hi,

Code:
textField.setText("Receiving data...");
SwingUtilities.invokeAndWait(new Runnable() {
    public void run() {
        database.execQuery("SELECT * FROM Tabelle");
    }
});
textField.setText("Received data.");

Gruß
Mag1c
 
...auch invokeAndWait kann wohl nur außerhalb des Event-Dispatch-Threads ausgeführt werden.

Könnte mir vielleicht kurz jemand auf die Sprünge helfen, was ich falsch mache? Ich habe in der Applikation die Darstellung und die Daten in verschiedene Objekte separiert. Aber anscheinend muss ich ja mindestens 2 Threads haben. Einen "Applikations"-Thread und einen "GUI"-Thread.

Muss ich in der Applikation dann das GUI (speziell den JFrame) in einem zusätzlichen Thread starten? Das macht die Anwendung doch direkt um längen komplizierter, wenn diese beiden Threads auf gemeinsame Daten zugreifen und synchronisiert werden müssen oder sehe ich das falsch?

Gruß,
AMiGA
 
Ohne Multithreading hast du keine Chance. Und ja, deine Anwendung wird komplizierter.

Wenn du die Klassen scharf auftrennst (die einen sind nur für die GUI, die anderen nur für den Arbeits-Thread), wird das Programm aber nicht allzu komplex (Stichwort MVC). Du solltest dir dann aber überlegen, wie und ob du die GUI blockierst, oder ob der User eine begonnene Aktion abbrechen und ersetzen kann...

Zur Kommunikation Arbeits-Thread <-> GUI empfehlen sich die Methoden "EventQueue.invokeAndWait" und ".invokeLater", damit sind die Threads synchronisiert (Swing & AWT unterstützen kein Multithreading).
 
Moin,

AMiGA hat gesagt.:
...auch invokeAndWait kann wohl nur außerhalb des Event-Dispatch-Threads ausgeführt werden.

Oh, ja sorry, das hab ich nicht gecheckt ???:L

Dann brauchst du wohl doch einen eigenen Thread für die DB-Abfrage. Ist aber nicht soo kompliziert. Die synchrone Anzeige im TextField kannst du ja trotzdem machen.

Gruß
Mag1c
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben