JProgressBar

N

Nice Slider

Gast
Hallo Leute!

Ich habe ein kleines Verständnis-Problem bei der JProgressBar!

Also ich habe ein Objekt mit vielen Buttons, der entsprechende ActionListener erstellt je nachdem WELCHER Button gedrückt wurde ein Objekt einer anderen Klasse, welches dann unterschiedliche Bilder aus einem ZIP-Archiv in ein Panel(GridLayout) im Objekt lädt/enthält (jeweils ca 200), Dateipfad ist je nachdem welcher Button gedrückt wurde anders sein!

So nun dauert das Laden dieser vielen Bilder natürlich einige Sekunden und ich würde gerne die JProgressBar verwenden um den Fortschritt beim Laden der Bilder/Erstellen der Klasse anzuzeigen!

Im Netz konnte ich zur ProgressBar BeispielCode wie diesen hier finden:

Java:
 JButton b = new JButton("Calculate");
  b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {

      for (int i = 0; i > 100; i++) {
          try { Thread.sleep(100); } 
           catch (InterruptedException ex) {}
          progressBar.setValue(i);
      }
    });


Mein Problem liegt jetzt peinlicherweise darin, dass ich nicht verstehe, wie ich diesen Code auf mein Beispiel mit dem Objekt erstellen im ActionListener anwenden muss....ist dafür eig generell Multithreading erforderlich?, denn das Laden der BIlder und das Abarbeitend des Ladebalkens müssen ja parallel erfolgen oder?

Schonmal danke für eure Hilfe, Tipps oder Ratschläge!

Möchte diese verwenden um den Fortschritt
 

turtle

Top Contributor
Ein ActionListener blockiert während seiner Laufzeit den EDT (event dispatch thread) von Swing und währenddessen ist kein GUI update möglich ist. Daher sollten länger dauernde Aktivitäten in einem Hintergrund-Thread ausgelagert werden.

Ich nehme dafür häufig den SwingWorker mit dem man "einfach" Änderungen an der GUI während der Arbeit des Hintergrundprozesses "publizieren" kann.

Mein Blog dazu zeigt ebenfalls eine ProgressBar an, während im Hintergrund "etwas" gemacht wird.
 
N

Nice Slider

Gast
Hmm also ich habe den in deinem Blog vorgeschlagenen Weg jetzt mal wie folgt implementiert in meinem Programm:

Java:
 private class EditionButtonHandler implements ActionListener {    // implements needs to overwrite all methods from ActionListener
     @Override
     public void actionPerformed(final ActionEvent event) {

           //JButton btn = (JButton) event.getSource();          // cast verursacht leider noch Probleme
           //btn.setEnabled(false);
           
           worker = new SwingWorker<Void, Integer>() {
                    @Override
                    protected void process(List<Integer> chunks) {
                        for (Integer progress: chunks) {
                            progressBar.setValue(progress);
                            progressBar.show();
                        }
                    }
 
                    @Override
                    protected Void doInBackground() throws Exception {
                        
                        String str = String.format("%s", event.getActionCommand());
                        System.out.println(str);
                    
                        Edition myObj = new Edition(str, ME);    // create EditionClass
                        
                        return null;
                    }
 
                    @Override
                    protected void done() {

                        progressBar.setValue(0);
                        //btn.setEnabled(true);
                    }
                };
                worker.execute();          
     }
     }


Wie kann ich denn jetzt die ProgressBar als Ladebildschirm anzeigen sodass man die auch sieht?
Weil will ja sowas in der Art wie den typischen 0815-Windows-Ladebalken dann haben wo der Fortschritt vom ProgressMonitor drin is =)

Eine Möglichkeit zum Abbrechen brauche ich btw atm noch nicht...

Bin aber schonmal nen Schritt weiter immerhin...
 

turtle

Top Contributor
Schon besser ;-)

Aber ich vermisse,das Du im Backgroundthread "Zwischen"ergebnisse publizierst. Diese werden dann von der Routine process im EDT abgearbeitet.

Java:
for (int i = 0; i < 100; i++) {
   Thread.sleep(delay);
   publish(i);
}

Ich habe mal ein kurzes Demo-Programm geschrieben, dass drei Buttons hat und dabei eine ProgressBar in unterschiedlichen Geschwindigkeiten füllt. Dies sollte auch zeigen, das ich keine Probleme habe, die Objekte auf Button zu casten.

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;

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

public class Test extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Test frame = new Test();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Test() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new FormLayout(new ColumnSpec[] {
				FormFactory.DEFAULT_COLSPEC, FormFactory.RELATED_GAP_COLSPEC,
				FormFactory.DEFAULT_COLSPEC, FormFactory.RELATED_GAP_COLSPEC,
				FormFactory.DEFAULT_COLSPEC, }, new RowSpec[] {
				FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC, }));
		final JProgressBar progressBar = new JProgressBar();

		JButton btn1 = new JButton("btn1");
		btn1.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent event) {
				JButton btn = (JButton) event.getSource(); // cast verursacht leider noch Probleme (bei mir nicht)
				btn.setEnabled(false);
				Turtle worker = new Turtle(progressBar, event, 10);
				worker.execute();
			}
		});
		contentPane.add(btn1, "1, 1");

		JButton btn2 = new JButton("btn2");
		btn2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JButton btn = (JButton) e.getSource(); 
				btn.setEnabled(false);
				Turtle worker = new Turtle(progressBar, e, 200);
				worker.execute();
			}
		});
		contentPane.add(btn2, "3, 1");

		JButton btn3 = new JButton("btn3");
		btn3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JButton btn = (JButton) e.getSource(); 
				btn.setEnabled(false);
				Turtle worker = new Turtle(progressBar, e, 1000);
				worker.execute();
			}
		});
		contentPane.add(btn3, "5, 1");

		contentPane.add(progressBar, "1, 3, 5, 1");
	}

}

class Turtle extends SwingWorker<Void, Integer> {
	private JProgressBar progressBar;
	private ActionEvent event;
	private int delay;

	Turtle(JProgressBar progressBar, ActionEvent event, int delay) {
		this.progressBar = progressBar;
		this.event = event;
		this.delay = delay;
	}

	@Override
	protected void process(List<Integer> chunks) {
		for (Integer progress : chunks) {
			progressBar.setValue(progress);
		}
	}

	@Override
	protected Void doInBackground() throws Exception {

		String str = String.format("%s", event.getActionCommand());
		System.out.println(str);

		// Edition myObj = new Edition(str, ME); // create EditionClass
		for (int i = 0; i < 100; i++) {
			Thread.sleep(delay);
			publish(i);
		}
		return null;
	}

	@Override
	protected void done() {

		progressBar.setValue(0);
		// btn.setEnabled(true);
	}
};
 

Anhänge

  • turtle.png
    turtle.png
    3,3 KB · Aufrufe: 34
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Kapselung JProgressBar in JTable, aber getValueAt() greift nicht Java Basics - Anfänger-Themen 7
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
E jProgressbar, 6 Versuche, welche value angeben ? Java Basics - Anfänger-Themen 3
E jProgressBar auf 0 stellen Java Basics - Anfänger-Themen 1
E JProgressbar Java Basics - Anfänger-Themen 8
M JProgressBar wird nicht richtig angezeigt Java Basics - Anfänger-Themen 8
S JProgressbar mit individuellem Start/Endpunkt Java Basics - Anfänger-Themen 11
V Zugriff auf jProgressbar Java Basics - Anfänger-Themen 10
D jProgressBar soll bei 100% sein wenn sql Abfrage inkl. jTable schreiben fertig ist... Java Basics - Anfänger-Themen 5
S JProgressBar richtig anwenden Java Basics - Anfänger-Themen 27
K Threads jProgressBar update Java Basics - Anfänger-Themen 14
J JProgressBar - wird nicht geupdated Java Basics - Anfänger-Themen 3
H JProgressBar wird nicht aktualisiert Java Basics - Anfänger-Themen 7
S jProgressBar läuft nicht! Java Basics - Anfänger-Themen 13
H Aktualisierung des JProgressBar in Abhängigkeit eines Threads Java Basics - Anfänger-Themen 5
Y jprogressbar beenden? Java Basics - Anfänger-Themen 4
L JProgressBar für FileUpload Java Basics - Anfänger-Themen 3
B Pseudo JProgressBar Java Basics - Anfänger-Themen 3
G JProgressBar - XP style Java Basics - Anfänger-Themen 4
G JProgressBar während dem ausführen einer Funktion Java Basics - Anfänger-Themen 3
S jProgressBar Java Basics - Anfänger-Themen 3
G JProgressBar Java Basics - Anfänger-Themen 2
G JProgressBar#2 Java Basics - Anfänger-Themen 2
G JProgressBar Java Basics - Anfänger-Themen 7
G jProgressBar value aus anderer Klasse heraus verändern Java Basics - Anfänger-Themen 7
B jProgressBar mit while nicht for Java Basics - Anfänger-Themen 13
K JProgressbar, zur laufzeit steuern Java Basics - Anfänger-Themen 7
V JProgressBar anklickbar? Java Basics - Anfänger-Themen 2
A Timer + JProgressBar Java Basics - Anfänger-Themen 4
G in JProgressBar Fortschritt anzeigen Java Basics - Anfänger-Themen 8
P JDialog & JProgressBar Java Basics - Anfänger-Themen 2
Z Problem mit JProgressBar Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben