Zum Inhalt springen

JFrame repaint ?


Aiun

Empfohlene Beiträge

hi,

folgendes Problem:

ich habe ein JFrame-Applikationsfenster, bein Onlcik auf einen Button wird eine andere (nicht-Swing) Klasse aufgerufen, die ca. 4000 Datensätze verarbeitet.

Während dieser verarbeitung währe es wichtig das der User erfährt Wieviele Datensätze verarbeitet wurden und welcher Typ (Datensätze kommen aus verschiedenen Tabellen, die ich hierarisch abarbeiten muss)

also wird vor beginn der berechnung ein JFrame aufgemacht.

JFrame

->Scrollpane

->->JTable

das ganze ist als Singleton implementiert. also mache ich sowas wie

Status.getInstance().addMessage()

und danach, damit das Scrollpane refreshed wird

Scrollpane.setViewportView(JTable)

doch leider wird das ganze erst gezeichnet, wenn die Datenverarbeitung zuende ist.

Habs als Runnable versucht und mit verschiedenen Reihenfolgen von .repaint und .dolayout

irgendwelche Ideen ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Link zu diesem Kommentar
Auf anderen Seiten teilen

@perdi: Danke für die Ergänzung. :)

Aber hier noch ein winziger Exkurs in Java-Threads.

Also: Lasse deine "nicht-Swing-Klasse" das Interface Runnable implementieren. (Warum nicht einfach die Klasse Thread erweitern? Saubere Kodier-Richtlininen sagen meistens aus, dass Interfaces bevorzugt zu benutzen sind.) Dann implementierst du entsprechend die Methode run() aus dem Interface.

public class DatensaetzeVerarbeiten implements Runnable {

	public void run() {

		// mach was

	}

}
Die Klasse, welche bei dir auf den Buttonklick reagiert, möglicherweise eine Controllerklasse oder dein JFrame selbst (oder was auch immer), lässt du dann entsprechend den Thread mit der Verarbeitung der Datensätze starten, zum Beispiel als Aufruf folgender Methode:
public void starteSuche() throws Exception {

	Thread verarbeitung = new Thread(new DatensaetzeVerarbeiten());

	verarbeitung.setDaemon(true);

	verarbeitung.start();

}

Das sollte dann auch schon reichen (so ganz grob).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alles noch sehr verwirrend...werde mir das wohl noch eine weile ansehen müssen.

Meine main-Klasse erstellt erst eine Datenbankverbindung, ruft dann das Haupt-JFrame auf und die berechnung geht los.

Ich muss meine Statusmeldungen in der Main-Klasse auch mit InvokeLater(..) abschicken...dann ging es.

danke auf jeden fall :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich mache das so:

Es gibt ein Interface "ProgressState"

public interface ProgressState

{

public void setProgress(int i, int n); // i von n dingen erledigt

}

und ein Fenster, der den Progress-Bar, .. etc. enhält und

dieses Interface implementiert

ProgressFrame extends JFrame implements ProgressState

{

}

Zum Schluß der Thread, der Daten verarbeitet, dem das Interface übergeben wird:

ProcessingThread extends Thread

{

private ProgressState ps;

public ProcessingThread(ProgressState ps) { this.ps = ps; }

public void run( .... ps.setProgress(i, n); ... }

}

Aufruf sieht dan so aus:

ProgressFrame pf = new ProgressFrame();

Pf.setVisible(true);

ProcessingThread pt = new ProcessingThread(pf);

pt.start();

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich mache das so: ....
Und Sun macht das so:

http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html

;)

Aber ich glaube, darum ging es hier eigentlich (noch) nicht. Aiun hat offenbar an der Nebenläufigkeit des Prozesses zu knabbern, um überhaupt dafür zu sorgen, dass die grafische Oberfläche weiterhin reagieren/sich neu zeichnen kann.

Die Anzeige des Bearbeitungsfortschritts in Form eines Statusbalken und/oder in Form von Ausgaben waren bislang nicht von Bedeutung.

Alles noch sehr verwirrend...
Was bereitet dir denn noch Schwierigkeiten? Grundsätzliche Probleme mit der Thematik Threads oder sind es bereits Detailfragen?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ansich ist es einfach, die "Reactivity" der Oberfläche zu erhalten: Man darf nichts machen, was den AWT/Swing Message-Dispatcher blockieren könnte, d.h keine länger dauernden Operation in von AWT/Swing aufgerufenen Listenern, z.b actionPerformed von ActionListener durchführen. Alles was längert dauert sollte daher in Threads ausgelagert werden.

MfG, Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ansich ist es einfach ... Man darf nichts ... von ActionListener durchführen....
... Das könnte sich in diesem Fall gewissermaßen als schwierig heraus stellen:

bein Onlcik auf einen Button wird eine andere (nicht-Swing) Klasse aufgerufen

Und das, da gebe ich dir natürlich recht, wird ...

in Threads ausgelagert
Aber ist das keine neue Erkenntnis. Eben darum geht es ja. So weit waren wir also schon. ;)

Naja, ich bin müde, werd jetz neue Energie für den morgigen Tag sammeln. Tschö mit ö. Und gute Nacht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...