GrandmasterZ Geschrieben 4. Juli 2002 Geschrieben 4. Juli 2002 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.... Zitieren
Dalton Geschrieben 4. Juli 2002 Geschrieben 4. Juli 2002 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... Zitieren
GrandmasterZ Geschrieben 4. Juli 2002 Autor Geschrieben 4. Juli 2002 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... Zitieren
LoCal Geschrieben 4. Juli 2002 Geschrieben 4. Juli 2002 Hi, probiers mal hiermit class Fortschrittsanzeige extends JDialog implements Runable Zitieren
Dalton Geschrieben 4. Juli 2002 Geschrieben 4. Juli 2002 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... Zitieren
Empfohlene Beiträge
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.