Zum Inhalt springen

Eigene Dialog-Klasse in eigenem Thread laufen lassen?


GrandmasterZ

Empfohlene Beiträge

Ich hab ein, wie ich denke, etwas schwierigeres Problem. Ich möchte eine Klasse erstellen, die eine Fortschrittsanzeige in einem eigenen modalen Dialog anzeigt.

In meinem anktuellen Programm möchte ich sie benutzen, um den Fortschritt einer Datenbankoperation anzuzeigen, bei der mehrer Tausend Zeilen einzeln per SQL Befehl in die Datenbank eingefügt werden (Also für jede Zeile wird ein eigener INSERT Befehl aus mehreren Variablen erzeugt und dann an die Datenbank geschickt. Natürlich nur mit einem Statement, das immer wieder überschrieben wird).

Das Problem ist nun, das das Dialogfenster der Fortschrittsanzeige zwar angezeigt wird, aber leer ist. Sobald die Datenbankoperation beendet ist, erscheint aber der Fortschrittsbalken und steht auf 100%. Deswegen vermute ich, das die Datenbankoperation so viel Rechenzeit beansprucht, das keine Zeit ist um das Dialogfenster "auszumalen". Deswegen möchte ich die Fortschrittsanzeige in einem eigenen Thread laufen lassen, bekomms aber nicht so ganz hin. Hier erst mal der bisherige Quelltext ohne irgendwas mit Threads:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class Fortschrittsanzeige extends JDialog {

public Fortschrittsanzeige(JFrame owner, String text, int min, int max) {

super(owner,"Fortschritt", false);

setBackground(Color.lightGray);

setResizable(false);

getContentPane().setLayout(new GridLayout(2,1));

aktVorgangLabel = new JLabel(text);

getContentPane().add(aktVorgangLabel);

balken = new JProgressBar(min, max);

getContentPane().add(balken);

pack();

setLocation(screen.width/2 - this.getWidth()/2, screen.height/2 - this.getHeight()/2);

setVisible(true);

}

//Ändert die Beschriftung des Labels, welches anzeigt was momentan gemacht wird

public void setBeschreibung(String text) {

aktVorgangLabel.setText(text);

}

//Startwert des Balkens setzen

public void setMin(int min) {

balken.setMinimum(min);

}

//Endwert des Balkens setzen

public void setMax(int max) {

balken.setMaximum(max);

}

//Start- und Endwert gleichzeitig setzen

public void setMinMax(int min, int max) {

balken.setMinimum(min);

balken.setMaximum(max);

}

//Fortschrittsbalken aktualisieren

public void setFortschritt(int wert) {

balken.setValue(wert);

}

private int maxWert, minWert;

private JLabel aktVorgangLabel;

private JProgressBar balken;

private Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();

}

Da die Klasse bereits von JDialog abgeleitet wurde, muss ich fürs Threading das Interface Runnable implementieren, das weiss ich schon. aber wie gehts weiter? Hab schon alles mögliche mit der run Methode und repaint() etc. versucht, es aber nie richtig hingekriegt. Oder soltle ich ganz anders ansetzen?

Bin dankbar für jegliche Hilfe....

Link zu diesem Kommentar
Auf anderen Seiten teilen

einen eigenen Thread hab ich bisher immer durch ableiten von Thread realisiert

in etwa so:

public class OwnThread

extends Thread {

public OwnThread() {}

public void run() {

int i = 0;

while (true) {

if (this.isInterrupted()) break;

System.out.println(i++);

}

}

}

//Instanzieren

OwnThread own = new OwnThread();

Hier ein paar Methoden:

own.start(); //starten des Threads, ruft auch run()

own.interrupt();//Thread unterbrechen

this.isInterrupt();//soll der Thread unterbrochen werden

Mehr Methode stehen in der API "java.lang.Thread".

Anders hab ich das leider noch nie gemacht!

Hoffe ich konnte dir weiterhelfen!

MfG...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Von Thread ableiten kann ich nicht, weil ich die Klasse ja schon von Dialog ableite, und Mehrfachvererbung gibts bei Java nicht.

Also muss ich mit

class blabla implements Runnable

das Thread Interface benutzen. Mein Hauptproblem ist, das ich nicht weiss an welcher Stelle ich jetzt ansetzen muss, was innerhalb des Threads ausgeführt werden muss etc., um in der oben beschriebenen Situation halt kein leeres, sondern ein ausgefülltes Fenster zu haben...

Link zu diesem Kommentar
Auf anderen Seiten teilen

nun ja du kannst aber auch deine bisherige Klasse unberührt lassen, sie in der von mir beschriebenen Klasse instanzieren und von dort aus mit setFortschritt(int) den Balken aktualiesieren

in etwa so :

Fortschrittsanzeige f = newFortschrittsanzeige

int wert=0;

while (true) {

if (this.isInterrupted()){return;}

f.setFortschritt(wert);

}

public void setWert(int newWert) {

wert = newWert;

}

Sollte funktionieren... er läuft sich zwar einen Wolf aber es sollte funktionieren...

mfg...

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...