Bekomme Thread nicht gleichzeitig gestartet.

sylo

Bekanntes Mitglied
HI zusammen

habe folgendes Problem. Ich lese eine XML-Datei ein und schreibe sie zeilenweise in eine Textarea.

Java:
row = bf.readLine();
	while (row != null) {
	textArea.setText(textArea.getText() + row + "\n");
	row = bf.readLine();
während dies passiert will ich, dass ein JProgressBar erscheint, der mir die Wartezeit versüsst 🙂
Die ganze Action startet mittels eines Buttons.
Java:
public void actionPerformed(ActionEvent e) {
				frameProgressBar.setVisible(true);
				thread = new Thread(new thread1());
				
				thread.start();
				
				guiElements.openTextMode();
				progressBar.setIndeterminate(false);
			}
In der Methode openTextMode() wird die oben genannte Schleife durchlaufen. Die Klasse thread1 sieht so aus.

Java:
public class thread1 implements Runnable {
		public void run() {
			
		}
	}

Die Methode run() ist aus dem Grund leer, weil ich nur den Balken von links nach rechts und zurück bewegen lassen will, und wenn die Methode openTextMode() fertig ist soll die Progressbar wieder aufhören.

Mit der Klasse SwingWorker soll es wohl einfach funktionieren, ich benutze aber Java 1.5, da ist es noch nicht enthalten.

Schon mal Dank für eure Hilfen.

Grüße
sylo
 
Dein Thread ist leer, er wird also direkt nach dem Start wieder beendet weil er durchgelaufen ist.

Außerdem führst du deine "lange schleife" auf dem EDT aus, diese Schleife solltest du in nen extra thread auslagern damit du deinen EDT nicht blockierst.
 
Soll ich den Thread dann künstlich füllen? Ich weis zu dem Zeitpunkt wo ich den/das/die Progressbar starte nicht wie lange es mit dem Befüllen der Textarea dauern wird.

Außerdem führst du deine "lange schleife" auf dem EDT aus, diese Schleife solltest du in nen extra thread auslagern damit du deinen EDT nicht blockierst.
Du meinst die Methode openTextMode()?

Grüße
sylo
 
sylo hat gesagt.:
Mit der Klasse SwingWorker soll es wohl einfach funktionieren, ich benutze aber Java 1.5, da ist es noch nicht enthalten.
😀

sylo hat gesagt.:
Du meinst die Methode openTextMode()?
Genau.
Die gesamte Schleife muss in nem extra Thread laufen. Sobald der Thread dann fertig ist kannst du die progressbar wieder verschwinden lassen.
 
Klar kann ich machen. Sieht jetzt aber etwas anderster aus, da ich doch die Prozentangabe haben wollte.

Also ich hab die Methode openTextMode()

Java:
public void openTextMode() {
		Thread thread1 = new Thread(new Runnable() {

			public void run() {
			......
//		 Hier ist mein sämtlicher Code der Methode. Unteranderem dann auch
		JLabel statusLabel = new JLabel("XML File is opened");
		JFrame frameProgressBar = new JFrame();
		frameProgressBar.setLocationRelativeTo(frame);
		JProgressBar progressBar = new JProgressBar(0, lines);
		progressBar.setStringPainted(true);
		frameProgressBar.getContentPane().add(progressBar, BorderLayout.CENTER);
		frameProgressBar.getContentPane().add(statusLabel, BorderLayout.SOUTH);

		frameProgressBar.setSize(300, 100);
		frameProgressBar.setVisible(true);

		try {
			row = bf.readLine();
			int i = 0;
			while (row != null) {
				textArea.setText(textArea.getText() + row + "\n");
				row = bf.readLine();
				progressBar.setValue(i);
				i++;
			}
			frameProgressBar.setVisible(false);
			} catch (IOException e) {
				e.printStackTrace();
			}

			..........
			}
		}
//		Und dann noch ausserhalb des Thread

		thread1.start();
}

Also brauche ich nicht zusätzlich zwei Threads zu öffnen, sondern es reicht wenn man zusätzlich zum EDT noch einen aufmacht.

Hoffe es ist verständlich.

Grüße
sylo
 
wenn mich nicht alles täuscht (bin kein GUI Exptere) solltest du aber folgende beiden sachen IM EDT machen:
Java:
                textArea.setText(textArea.getText() + row + "\n");
                progressBar.setValue(i);

-->

Java:
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
       textArea.setText(textArea.getText() + row + "\n");
       progressBar.setValue(i);

    }
});
 
mmmhhh. Ich wüsste nicht warum. Die Zeile
Java:
progressBar.setValue(i);
muss doch in der Schleife bleiben, damit der Wert jedesmal gesetzt werden kann, oder?
 
es stimmt aber schon, aktionen die GUI Komponenten verändern sollten im EDT ausgeführt werden, sonst kann es unter umständen zu komischen fehlern kommen (muss aber nicht).
Die Zeile kann aber trotzdem noch in der Schleife bleiben:

Java:
        while (row != null) {
            row = bf.readLine();
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    textArea.setText(textArea.getText() + row + "\n");
                    progressBar.setValue(i);
                }
            });
            i++;
        }
 

Neue Themen


Zurück
Oben