Einfaches "Bitte Warten"-Fenster mit JProgressBar erstellen

timgkeller

Grünschnabel
Hallo Leute,

das ist für mich das erste mal, dass ich im Internet um Hilfe bitte. Bisher habe ich mit alles immer ohne Probleme gefunden und hinbekommen.

Die Situation ist folgende:

Ich habe eine Klasse "Database", der ich ein File-Objekt übergeben und damit ein "Database-Objekt" aus einer txt/html Datei erzeugen kann. Die Datenbank wird aus der Datei Zeile für Zeile eingelesen und in verschiedenen ArrayLists abgespeichert.

Da diese Operation je nach größe der Datenbank einige Zeit in Anspruch nehmen kann, möchte ich gerne ein einfaches "Bitte Warten"-Fenster erzeugen, das den Status des Vorgangs in einer JProgressBar darstellt.

Das Fenster soll in etwa diese Struktur haben:

Code:
public class PleaseWaitWindow extends JFrame {

     public PleaseWaitWindow(int anzahlZeilenInTextdokument) {

          /* Hier sollte das Fenster mit einem Text und der Progressbar mit der Länge
             des einzulesenden Dokuments erzeugt und auf visible = true gesetzt werden */

     }

     public void increase(){

          //Hier sollte die JProgressBar um 1 hochgezählt werden

     }

}

In der Klasse Database möchte ich nun vor dem Einlesen des Dokuments ein PleaseWaitWindow erstellen:

PleaseWaitWindow wait = new PleaseWaitWindow(anzahlZeilenInTextdokument);

Dieses soll dann nach jeder bearbeiteten Zeile die JProgresBar etwas anwachsen lassen:

wait.increase();

Und am Schluss, nach einlesen aller Zeilen rufe ich einfach wait.dispose(); auf, um das Fenster zu schließen.


Soviel zur Theorie :(... Leider ist es mir bisher nicht einmal gelungen irgendein Fenster (mit Inhalt) während des Einlesens darzustellen. Der Rahmen wird immer gezeichnet, nicht jedoch der Text oder die ProgressBar. Ich habe auch schon versucht das ganze in einen neuen Thread zu packen, leider auch ohne Erfolg.

Ich hoffe jemand kann mir bei meinem Problem weiterhelfen!
Vielen Dank schonmal, Tim

EDIT:

Hier mal der Code, den ich bisher verwende, der aber nicht funktioniert:

PleaseWaitWindow-Class

Code:
public class PleaseWaitWindow extends JFrame {
	
	private JProgressBar bar;
  
	public PleaseWaitWindow(int length){
		bar = new JProgressBar( 0, length);
		bar.setStringPainted( true );
		
		JLabel label1 = new JLabel( "Please wait..." );
		
		add( label1, BorderLayout.PAGE_START ); 
		add( bar, BorderLayout.PAGE_END ); 
		
		setVisible(true);
		pack();
	} 

  
	public void increase(){
		bar.setValue(bar.getValue()+1);
	}
}

Ausschnitt aus der Database-Class (Constructor), aber die sollte nach Möglichkeit so bleiben:

Code:
public Database(File filename){
	BufferedReader input = null;
    	PleaseWaitWindow wait = new PleaseWaitWindow(getFileLength(filename));
	
	try {
		if (filename.getName().indexOf(".htm")!= -1){
			processHTML(filename);
		}
		else if (filename.getName().indexOf(".txt")!= -1) {
			input = new BufferedReader(new FileReader(filename));
			while (true) {
				processLine(input.readLine());
				wait.increase();
			}
		}
			
	} 
	catch (IOException e) {
		System.err.println("Error reading file!");
	}
	catch (NullPointerException exc) {
		bar.dispose();
	}
	finally	{
		try{input.close();} catch (Exception e) {}
	}
}
 
Zuletzt bearbeitet:
Hi,

wollte nur bescheid sagen, dass ich inzischen herausgefunden habe, wie es geht. Muss Swing und den restlichen Code in getrennte Threads schieben, damit die sich nicht behindern.

Eigentlich ganz einfach :rolleyes:

Gruss Tim
 
Zurück