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();
															
				}		
			}
		});
 
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.
 
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:
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:
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:
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ß
 

Zurück
Oben