Swing JProgressBar in JDialog wird nicht angezeigt

Curry

Aktives Mitglied
Moin Moin!

Ich lese die Dateien eines Verzeichnises aus. Nach dem Auslesen werden diese Dateien in einer for-Schleife verarbeitet. Dieser Vorganng ist zeitintensiv. Deshalb würde ich gerne ein JDialog anzeigen, der den Status des Vorgangs mit einer JProgressbar und einer JTextArea wiederspiegelt.

Doch wird der Inhalt des JDialog immer erst angezeigt, wenn die ganze Arbeit getan ist. Oder wenn ich den Dialog modal setze (was eigentlich auch richtig wäre), dann läuft die Schleife nicht mehr ab.

Was könnte ich da tun? Threads?

Java:
public void readDirectory(String path) {
	
	File dir = new File(path);
	File[] files = dir.listFiles();
	
	// Dialog
	final JDialog dialog = new JDialog((JFrame)null, "Loading ...");
//	dialog.setModal(true);
	
	// Dialog - Label & ProgressBar
	JProgressBar pb = new JProgressBar(1, files.length);
	pb.setPreferredSize(new Dimension(175,20));
	pb.setString("Working");
	pb.setStringPainted(true);
	pb.setValue(1);
	
	JLabel label = new JLabel("Progress: ");
	JPanel northPanel = new JPanel();
	northPanel.add(label);
	northPanel.add(pb);
	dialog.getContentPane().add(northPanel, BorderLayout.NORTH);

	// Dialog - TextArea
	JTextArea ta = new JTextArea(10, 20);
	JPanel centerPanel = new JPanel();
	centerPanel.add(new JScrollPane(ta));
	dialog.getContentPane().add(centerPanel, BorderLayout.CENTER);
	
	// Dialog - Button
	JButton button = new JButton("Done");
	button.setActionCommand("done");
	button.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent evt) {
			if ( evt.getActionCommand().equals("done") ) {
				dialog.dispose();
			}
		}
	});
	JPanel southPanel = new JPanel();
	southPanel.add(button);
	dialog.getContentPane().add(southPanel, BorderLayout.SOUTH);
	
	// Dialog - Anzeige
	dialog.pack();
	dialog.setLocationRelativeTo(null);
	dialog.setVisible(true);
	dialog.toFront();
	
	// Logik
	if (files != null) {
		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile()) {
				int id = Integer.parseInt(files[i].getName().substring(0, files[i].getName().indexOf('.')));
				// Verarbeitung der Dateien die Zeit braucht steht eigentlich hier
				pb.setValue(i+1);
				ta.append((i + 1) + " -> " + Integer.toString(id) + "\r\n");
			}
		}
	}
}
 

Wildcard

Top Contributor
Ich habe schon Jahre nichts mehr mit Swing gemacht, aber es sollte auch ohne repaint funktionieren sobald das Threading Problem behoben ist.
 

Curry

Aktives Mitglied
Ich habe mir eure Tipps mal angeschaut und ein Demo-Programm (welches die Anforderungen in meinem eigentlichen Programm simuliert) geschrieben.

Es funktioniert eigentlich schon sehr schön. Der Arbeitsprozess ist jetzt in einer Klasse MyWorker untergebracht, welche von Thread abgeleitet wurde. Für die Anzeige des Fortschritts verwende ich eine Klasse MyProgressDialog, die von JDialog abgeleitet ist. Das funktioniert auch schon sehr schön, aber wenn ich den Dialog modal setze, dann läuft der Worker nicht. Warum das so ist, dass verstehe ich schon, aber ich habe leider keine Idee wie ich das besser machen kann.

Die offizielle Klasse SwingWorker möchte ich ungerne benutzen, da ich sie nicht komplett verstehe. Ich würde lieber etwas Schlankeres verwenden, das ich selbst durchdringe. ;-)
Würde mich über Hilfe, Tipps und Anregungen freuen.

Hauptprogramm:
Java:
import java.awt.*;
import java.awt.event.*;
import java.io.File;

import javax.swing.*;


class MainFrame extends JFrame implements ActionListener {

	public MainFrame() {
		super("Test");
		initComponents();
	}
	
	private void initComponents() {
		Container cp = getContentPane();
		cp.setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		
		JButton button = new JButton("start");
		button.addActionListener(this);
		gbc.gridy = 1;
		gbc.gridx = 1;
		cp.add(button, gbc);
		pack();
	}
	
	public void actionPerformed(ActionEvent event) {
		
		System.out.println(getClass().getName() + ".actionPerformed");
		
		File dir = new File("d:/");
		File[] files = dir.listFiles();
		
		/*
		 * Der Dialog soll den Fortschritt des Workers anzeigen und den Rest des unterbrechen (bis auf den Worker)
		 */
		MyProgressDialog dialog = new MyProgressDialog(this, "Loading...", 0, files.length);
		
		/*
		 * Der Worker vollrichtet die Arbeit und gibt dem Dialog regelmäßig den aktuellen Fortschritt durch, 
		 * damit dieser dem User diesen anzeigen kann
		 */
		MyWorker worker = new MyWorker(files, dialog);
		worker.start();
	}
	
}

MyProgressDialog:
Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class MyProgressDialog extends JDialog implements ActionListener {
	
	private JProgressBar pb;
	private JTextArea ta;
	private JButton button;
	private String msg;
	
	private int min;
	private int max;
	private int i;
	
	public MyProgressDialog(Frame owner, String msg, int min, int max) {
		super(owner, false);

		this.msg = msg;
		this.min = min;
		this.max = max;
		this.i = min;		
		
		initComponents();
	}
	
	public void initComponents() {
		
		Container cp = getContentPane();
		cp.setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		
		// Label
		JLabel label = new JLabel(msg);
		gbc.gridy = 1;
		gbc.gridx = 1;
		cp.add(label, gbc);
		
		// ProgressBar
		pb = new JProgressBar(min, max);
		pb.setPreferredSize(new Dimension(175,20));
		pb.setString("in progress");
		pb.setStringPainted(true);
		pb.setValue(1);
		gbc.gridy = 2;
		gbc.gridx = 1;
		cp.add(pb, gbc);
		
		// TextArea
		ta = new JTextArea(10, 20);
		gbc.gridy = 3;
		gbc.gridx = 1;
		cp.add(new JScrollPane(ta), gbc);
		
		// Button
		button = new JButton("close");
		if(i < max) {
			button.setEnabled(false);
		}
		gbc.gridy = 4;
		gbc.gridx = 1;
		cp.add(button, gbc);

		// Display the Dialog
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
		toFront();
	}
	
	public void increment() {
		i++;
		pb.setValue(i);
		if(i >= max) {
			button.setEnabled(true);
			pb.setString("done");
		}
	}
	
	public void addComment(String comment) {
		ta.append(comment);
	}
	
	public void actionPerformed(ActionEvent event) {
		System.out.println(getClass().getName() + ".actionPerformed");
	}
	
}

MyWorker:
Java:
import java.io.*;


public class MyWorker extends Thread {
	
	private boolean running = false;
	private File[] files;
	private MyProgressDialog dialog;
	
	public MyWorker(File[] files, MyProgressDialog dialog) {
		this.files = files;
		this.dialog = dialog;
	}
	
	public void run() {
		
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				dialog.increment();
				dialog.addComment(files[i].getName() + "\r\n");
				try {
					sleep(2500);
				} catch (InterruptedException ex) {
					ex.printStackTrace();
				}
			}
		}
		
	}

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
A Swing JProgressbar im Windows Look & Feel Farbanpassung AWT, Swing, JavaFX & SWT 2
G JProgressBar: Verständnis Problem AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
T Swing JProgressBar mit String unschön AWT, Swing, JavaFX & SWT 5
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
V Swing JProgressBar aktualisieren AWT, Swing, JavaFX & SWT 14
M JProgressBar updatet nicht AWT, Swing, JavaFX & SWT 4
T Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster AWT, Swing, JavaFX & SWT 6
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
J JProgressBar Indeterminate AWT, Swing, JavaFX & SWT 17
J JProgressBar Farbverlauf AWT, Swing, JavaFX & SWT 2
O Probleme mit JProgressBar bei der Statusanzeige AWT, Swing, JavaFX & SWT 5
S jProgressbar von einem Download AWT, Swing, JavaFX & SWT 6
S Swing StatusLeiste mit JProgressBar AWT, Swing, JavaFX & SWT 4
S JProgressBar in Abhängigkeit eines FileInputStreams AWT, Swing, JavaFX & SWT 2
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
S Problem mit JProgressBar AWT, Swing, JavaFX & SWT 3
E Swing DB Zugriff mit JProgressBar?! AWT, Swing, JavaFX & SWT 8
C Swing JProgressBar Aktualisiert sich nicht. AWT, Swing, JavaFX & SWT 9
M JProgressBar Look and Feel AWT, Swing, JavaFX & SWT 5
C JProgressBar und JLabel AWT, Swing, JavaFX & SWT 5
K JProgressBar transparent AWT, Swing, JavaFX & SWT 10
M JProgressBar AWT, Swing, JavaFX & SWT 2
K JProgressBar für Serialisierung AWT, Swing, JavaFX & SWT 6
multiholle [JProgressBar] Raster deaktivieren AWT, Swing, JavaFX & SWT 14
M JProgressBar übereinander legen? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Repaint bei JProgressBar AWT, Swing, JavaFX & SWT 3
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
H JProgressBar in TableColumn von JTable setzen/abfragen AWT, Swing, JavaFX & SWT 5
B JProgressBar: wie muss ich das lösen? AWT, Swing, JavaFX & SWT 4
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
G JProgressbar AWT, Swing, JavaFX & SWT 8
A JProgressBar: Farbe im Windows Look&Feel ändern. AWT, Swing, JavaFX & SWT 1
C JProgressBar und ihre Tücken AWT, Swing, JavaFX & SWT 8
G JProgressBar in JTable AWT, Swing, JavaFX & SWT 6
G Probleme mit JProgressbar auf JPanel in JFrame AWT, Swing, JavaFX & SWT 6
F JProgressBar und NullPointerException AWT, Swing, JavaFX & SWT 4
T JProgressBar und CMP Bean AWT, Swing, JavaFX & SWT 2
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
S JProgressBar zu JOptionPane hinzufügen. AWT, Swing, JavaFX & SWT 8
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
L JProgressbar möglichst genau AWT, Swing, JavaFX & SWT 3
G JProgressBar + Thread + Client AWT, Swing, JavaFX & SWT 10
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G JProgressBar AWT, Swing, JavaFX & SWT 8
L JProgressBar wird nicht mehr aktualisiert AWT, Swing, JavaFX & SWT 2
U JProgressBar in umgekehrter Richtung AWT, Swing, JavaFX & SWT 2
S JProgressBar einbinden AWT, Swing, JavaFX & SWT 5
H JProgressBar AWT, Swing, JavaFX & SWT 6
T JProgressBar und JPG AWT, Swing, JavaFX & SWT 2
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
L Swing JDialog ton beim klicken ausstellen AWT, Swing, JavaFX & SWT 1
L JDialog hat manchmal keinen Inhalt AWT, Swing, JavaFX & SWT 2
Drachenbauer Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge. AWT, Swing, JavaFX & SWT 19
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
B Eingaben im JDialog abwarten AWT, Swing, JavaFX & SWT 4
S Swing JDialog mit KeyEvent als Rückgabe AWT, Swing, JavaFX & SWT 1
O Swing JDialog öffnen und dann warten bis er geschlossen wurde AWT, Swing, JavaFX & SWT 2
stylegangsta JDialog bestimmte Zeilen kursiv AWT, Swing, JavaFX & SWT 20
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
Bluedaishi JDialog modal und JTextArea AWT, Swing, JavaFX & SWT 4
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
T Event Handling JDialog schließen, sobald ein neuer erzeugt wird AWT, Swing, JavaFX & SWT 3
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
D Button auf geöffnetem JDialog AWT, Swing, JavaFX & SWT 5
N Definitionen JDialog AWT, Swing, JavaFX & SWT 7
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
D Swing Schließen von JDialog soll auch JFrame schließen. AWT, Swing, JavaFX & SWT 4
N Swing Fragen zu non-modal JDialog AWT, Swing, JavaFX & SWT 1
F Swing JDialog schließen - WindowListener bekommt dispose nicht mit AWT, Swing, JavaFX & SWT 0
N JDialog als Progress-Anzeige AWT, Swing, JavaFX & SWT 6
M JDialog statt JFrame AWT, Swing, JavaFX & SWT 22
I focus an ein jdialog geben AWT, Swing, JavaFX & SWT 3
3 JDialog über einem Vollbildfenster anzeigen AWT, Swing, JavaFX & SWT 5
M JDialog soll JFrame "blockieren" AWT, Swing, JavaFX & SWT 2
K JDialog zeigt Components nicht an AWT, Swing, JavaFX & SWT 3
S Jframe aus JDialog starten AWT, Swing, JavaFX & SWT 4
M JDialog übergibt eingaben nicht an aufrufende klasse AWT, Swing, JavaFX & SWT 15
S Assistent im JDialog AWT, Swing, JavaFX & SWT 7
H Swing JDialog cannot be resolved as a typ AWT, Swing, JavaFX & SWT 12
C Swing JDialog "flutet" den Arbeitsspeicher AWT, Swing, JavaFX & SWT 9
S Swing Eigenen JDialog mit Rückgabewert AWT, Swing, JavaFX & SWT 3
C Swing JDialog Ladebildschirm wird nicht angezeit AWT, Swing, JavaFX & SWT 5
Jagson Mit JMenu auf jDialog zurück? Wie? AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben