jprogressbar während datenabfrage anzeigen

hausmann

Mitglied
Hallo,

versuche seit Tagen einen progressbar anzuzeigen der deutlich macht das das Programm noch arbeitet. Verstehe es einfach nicht.

Nachdem dem klick auf ein jlabel wird ein Wert aus einer Liste ausgelesen. Je nachdem welcher es ist sollen verschiedene Dinge passieren.
Der Vorgang der im else teil steht dauert länger, daher soll ein progressbar zeigen das noch etwas passiert.

Der ProgressBar wird nicht angezeigt.
Was mache ich falsch?

Vielen Dank für jeden Hinweis dazu!

Java:
lblStart.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				Object scene = lst_Scenarios.getSelectedValue();

				if (scene==null){
					JOptionPane.showMessageDialog(null, "Please select a scenario!");						
				}
				else if (scene.toString().startsWith("< "))
				{
					addNewScenario();
				}
				else{					
							
					progressBar.setVisible(true);
					progressBar.setIndeterminate(true);			
							
					new Thread(){
						@Override public void run(){
							Object scene = lst_Scenarios.getSelectedValue();
							PropertyController pc= new PropertyController();					
							String scenarioPath = pc.getBaselineDir();			
							pc.setSceneDir(scenarioPath + "//" + scene);
							MainWindow.showScenarioTab();
						}
					
					}.start();
															
				}		
			}
		});
 

turtle

Top Contributor
Grundsätzlich wundert mich, dass Du auf ein Label klicken möchtest? Das finde ich als User verwirrend und erwarte ich nicht. Ich klicke praktisch niemals auf Labels. Dafür sind doch Buttons da, oder?

Weiter sehe ich, das Du die Progressbar im mouseClicked-Handler sichtbar machst. Das geht nicht, weil die Abarbeitung den EDT blockiert.

Java:
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(true);

Ich würde versuchen die beiden Zeilen im Thread auszuführen und ich nehme für derartige Aufgaben immer den SwingWorker, den Du dir mal ansehen solltest.
 

hausmann

Mitglied
Hab vielen Dank turtle!

In den labels sind bilder die deutlich machen das man draufklicken kann. Fand es leichter damit das Aussehen anzupassen als mit Buttons.

Ja, darüber habe ich etwas gelesen "den EDT blockieren".
Wenn ich die beiden Zeilen in den Thread stecke wird der Progressbar angezeigt, er bewegt sich aber nicht.

Bei diesem Beispiel wird der progressbar angezeigt und bewegt sich:
Java:
new Thread(){
						@Override public void run(){
							progressBar.setVisible(true);
							progressBar.setIndeterminate(true);	
//							Object scene = lst_Scenarios.getSelectedValue();
//							PropertyController pc= new PropertyController();					
//							String scenarioPath = pc.getBaselineDir();			
//							pc.setSceneDir(scenarioPath + "//" + scene);
//							MainWindow.showScenarioTab();
							try {
								Thread.sleep(3000);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
					
					}.start();
Das zeigt doch: die auskommentierten Zeilen verhindern das sich das Fenster neu zeichnet, oder?
Der EDT wird weiterhin blockiert.
Wie starte ich einen Thread der wirklich unabhängig davon ist?

Danke für die Hilfe!
 
Zuletzt bearbeitet:

hausmann

Mitglied
Hab das Problem gefunden, es lag an der Reihenfolge der Aufrufe in MainWindow.showScenarioTab
Hatte zuerst:
Java:
cardPanel.removeAll();
scenarioTab= new ScenarioTab();

jetzt geändert in:
Java:
scenarioTab= new ScenarioTab();
cardPanel.removeAll();

läuft. Klar, wenn nichts mehr auf dem cardPanel ist kann auch nichts aktualisiert werden.:idea:
Mei und das nach 10 Stunden.
 
Zuletzt bearbeitet:

turtle

Top Contributor
Ich hatte ja schon SwingWorker angesprochen ;)

Das Schöne daran ist unter anderem, dass ziemlich einfach Teile des Code im EDT ausführen und andere im Hintergrund ablaufen können. Dabei gibt es auch die Unterstützung Zwischenergebnisse während des Background-Threads sofort im EDT anzuzeigen.

Hier mal mein kleines Demo-Programm. Dieses läuft im Hintergrund bis 100, wobei zwischen den einzelnen Schritten unterschiedlich lange gewartet wird. Im Vordergrund zeigt eine ProgressBar den aktuellen Fortschritt an. Über publish() werden die Zwischenergebniss (der aktuelle Fortschritt) "publiziert", der dann im EDT zur Änderung führt. Ist von mir mal geschrieben worden um den SwingWorker zu evaluieren, ist also "dirty" Code, aber zur Demo...

Java:
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;

@SuppressWarnings("serial")
public class LongTask extends JPanel {
	private JButton btnStart;
	private JButton btnStop;
	JProgressBar progressBar;
	SwingWorker<Void, Integer> worker;

	public LongTask(String name) {
		setLayout(new FormLayout(
				new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC,
						ColumnSpec.decode("default:grow"),
						FormFactory.RELATED_GAP_COLSPEC,
						FormFactory.DEFAULT_COLSPEC,
						FormFactory.RELATED_GAP_COLSPEC,
						FormFactory.DEFAULT_COLSPEC, }, new RowSpec[] {
						FormFactory.RELATED_GAP_ROWSPEC,
						FormFactory.DEFAULT_ROWSPEC,
						FormFactory.RELATED_GAP_ROWSPEC,
						FormFactory.DEFAULT_ROWSPEC,
						FormFactory.RELATED_GAP_ROWSPEC, }));

		JLabel lblNewLabel = new JLabel("Starte lange Task");
		add(lblNewLabel, "2, 2");

		btnStart = new JButton("Start");
		add(btnStart, "4, 2");

		btnStop = new JButton("Stop");
		add(btnStop, "6, 2");

		progressBar = new JProgressBar();
		add(progressBar, "2, 4, 5, 1, fill, default");

		progressBar.setStringPainted(true);
		progressBar.setMinimum(0);
		progressBar.setMaximum(100);
		progressBar.setValue(0);
		btnStart.setEnabled(true);
		btnStop.setEnabled(false);
		btnStop.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				worker.cancel(true);
				progressBar.setValue(0);
			}
		});
		btnStart.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				btnStart.setEnabled(false);
				btnStop.setEnabled(true);
				worker = new SwingWorker<Void, Integer>() {
					@Override
					protected void process(List<Integer> chunks) {
						for (Integer progress: chunks) {
							progressBar.setValue(progress);
						}
					}

					@Override
					protected Void doInBackground() throws Exception {
						Random random = new Random();
						int progress = 0;
						setProgress(0);
						while (progress < 100 && !isCancelled()) {
							Thread.sleep(random.nextInt(500));
							// Make random progress.
							progress += random.nextInt(10);
							progress = Math.min(progress, 100);
							publish(progress);
						}
						return null;
					}

					@Override
					protected void done() {
						Boolean completed = isCancelled();
						if (completed) {
							JOptionPane.showMessageDialog(LongTask.this,
									"Abgebrochen");
						} else {
							JOptionPane.showMessageDialog(LongTask.this,
									"Fertig");
						}
						progressBar.setValue(0);
						btnStart.setEnabled(true);
						btnStop.setEnabled(false);
					}
				};
				worker.execute();
			}
		});
	}

	public static void main(String[] args) {
		try {
			JFrame frame = new JFrame("longTask");
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			LongTask swingWorker = new LongTask("progress.xml");
			frame.add(swingWorker);
			frame.pack();
			frame.setVisible(true);
		} catch (HeadlessException e) {
			e.printStackTrace();
		}
	}
}
 

Anhänge

  • LongTask.png
    LongTask.png
    19,1 KB · Aufrufe: 38
Zuletzt bearbeitet:

hausmann

Mitglied
turtle, noch mal vielen Dank für Deine Mühen und das Beispiel!

Hatte den Hinweis auf SwingWorker eben im Wahn schon wieder vergessen.:bloed:

Die Erklärung hier fand ich gut verständlich.
Werde das beim nächsten Mal damit versuchen.

Schönen Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
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
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
C Swing JProgressBar in JDialog wird nicht angezeigt 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
H JItem während der Programmlaufzeit verändern AWT, Swing, JavaFX & SWT 8
G JavaFX BarChart während der Runtime aktualisieren AWT, Swing, JavaFX & SWT 4
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
S JavaFX ListView Inhalte während Laufzeit ändern AWT, Swing, JavaFX & SWT 23
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
B 3D-Grafik Java 3D Licht während Laufzeit ändern AWT, Swing, JavaFX & SWT 0
Joew0815 Dropdown meue während der Laufzeit ändern. AWT, Swing, JavaFX & SWT 6
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
B ProgressBar während Berechnung AWT, Swing, JavaFX & SWT 4
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
M JLabel aktualsisieren während Verarbeitung AWT, Swing, JavaFX & SWT 12
E Buttons während einer Berechnung deaktivieren AWT, Swing, JavaFX & SWT 6
D JTable Mausevents, während editiert wird AWT, Swing, JavaFX & SWT 5
T Swing JFrame blockieren während anderes JFrame offen ist AWT, Swing, JavaFX & SWT 2
R Wie Vorgehen bei fundamentaler Veränderung des Layouts während des Programmablaufs? AWT, Swing, JavaFX & SWT 19
S Programm pausieren während JDialog offen ist AWT, Swing, JavaFX & SWT 2
X Tabelle während Funktionsaufruf aktualisieren AWT, Swing, JavaFX & SWT 11
S Swing JTextArea während der Laufzeit füllen AWT, Swing, JavaFX & SWT 5
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
R GUI hängt während Programm läuft AWT, Swing, JavaFX & SWT 7
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
S Swing Während Frame verschoben wird... AWT, Swing, JavaFX & SWT 2
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
T Swing Dialoginhalt automatisch anpassen während Größenänderung AWT, Swing, JavaFX & SWT 2
D Swing Anzeige während eines Ladevorganges AWT, Swing, JavaFX & SWT 6
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
M SWT Mutter-Shell blocken während Tochter-Shell noch offen ist AWT, Swing, JavaFX & SWT 6
S Swing DnD: Image während Drag-Operation ändern AWT, Swing, JavaFX & SWT 3
M Swing JTable während Laufzeit beschreiben AWT, Swing, JavaFX & SWT 14

Ähnliche Java Themen

Neue Themen


Oben