Progress Bar Updaten

Bazilinho

Mitglied
Hi!
Sry, dass ich hier (wieder) mit ner Noob-Frage um die Ecke komme, zumal es auch diverse Postings zu diesem Thema gibt... :oops:

Aber ich kriegs einfach nicht wirklich hin, dass sich mein JProgressbar zur Laufzeit aktualisiert..
Obwohl ich schon einiges ausprobiert habe, aber dafür bin ich offen bar zu blöd... :rtfm:

Kurz zum Ablauf meines Progs:

Ich habe (unter Anderem) eine GUI-Klasse, die beinhaltet einige Button, auf denen ein ActionListener liegt..

Java:
 ActionListener first_listener = new ActionListener() {

    		
			public void actionPerformed(ActionEvent e) {
				
				
				Stored_Values[] sv = vkr.read(path, date_choosed, "", converted);
				local_today = local_today.replace("-", "_");
				if (local_today.equals(date_choosed) == false) {
					paint_graphs(dt);
				}
				else {
					paint_graphs_tdy(dt);
				}
			}
        };

Wichtig ist hierbei eigentlich auch nur Zeile 7! In der Klasse vkr wird die read-Mathode angestossen, die mir eben das Array der Values zurückgibt.

Die entsprechende Methode sieht so aus..

Java:
public Stored_Values[] read_(String pfad, String date, String date_2, String conv_in) {
		
jfr = new JFrame("Status-Info");
		jfr.setLayout(new GridLayout(2,0));
		jfr.setSize(450,60);
		
		jpb= new JProgressBar(0, (progress_end*2));
		jpb.setValue(0);
		jpb.setStringPainted(true);
		
		JLabel info1 = new JLabel("Wait plz");
		jfr.add(info1);
		jfr.add(jpb);
			
		jfr.repaint();
		jfr.pack();
		jfr.validate();
		jfr.setVisible(true);
		
		
		
		boolean firstrun = false;
		
		Stored_Values[] all_days = new Stored_Values[1];
		
		String localdate_start = date;
		localdate_start = localdate_start.replace("_", "-");
		
		double[] t1 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t2 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t3 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t4 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t5 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t6 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t7 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t8 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t9 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		double[] t10 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
		
		
		File ImportFolder = new File(pfad);
		File[] data_list;
		ArrayList<File> found_files_for_date = new ArrayList<File>();
		data_list = ImportFolder.listFiles();
		
		for (int list_int = 0; list_int < data_list.length; list_int++) {
			String file_name = data_list[list_int].getName();
			if (file_name.contains(localdate_start) && file_name.startsWith(".~") == false && file_name.startsWith("~") == false) {
				found_files_for_date.add(data_list[list_int]);
			}
		}
		
		progress_end = found_files_for_date.size();
		Iterator file_iterator = found_files_for_date.iterator();
		Iterator file_iterator_provider = found_files_for_date.iterator();
		
		while (file_iterator.hasNext()) {
			

			
			round_counter++;
	
	
			
			File this_one = (File) file_iterator.next();
			XSSFWorkbook wb_this = null;
		    
			try {
				wb_this = new XSSFWorkbook(this_one.getAbsolutePath());
				

		    }
		    catch(IOException e) {
		        e.printStackTrace();
		    }
		    
			Sheet sheet_day_data = wb_this.getSheetAt(0);
		    Vector dat_vec = new Vector();
		    String dest_month_nextline[];

		
		dtv.set_tt_1(t1[0], t1[1], t1[2], t1[3], t1[4], t1[5], t1[6], t1[7], t1[8], t1[9], t1[10], t1[11], t1[12], t1[13], t1[14], t1[15], t1[16], t1[17], t1[18], t1[19], t1[20], t1[21], t1[22], t1[23]);
		dtv.set_tt_2(t2[0], t2[1], t2[2], t2[3], t2[4], t2[5], t2[6], t2[7], t2[8], t2[9], t2[10], t2[11], t2[12], t2[13], t2[14], t2[15], t2[16], t2[17], t2[18], t2[19], t2[20], t2[21], t2[22], t2[23]);
		dtv.set_tt_3(t3[0], t3[1], t3[2], t3[3], t3[4], t3[5], t3[6], t3[7], t3[8], t3[9], t3[10], t3[11], t3[12], t3[13], t3[14], t3[15], t3[16], t3[17], t3[18], t3[19], t3[20], t3[21], t3[22], t3[23]);
		dtv.set_tt_4(t4[0], t4[1], t4[2], t4[3], t4[4], t4[5], t4[6], t4[7], t4[8], t4[9], t4[10], t4[11], t4[12], t4[13], t4[14], t4[15], t4[16], t4[17], t4[18], t4[19], t4[20], t4[21], t4[22], t4[23]);
		dtv.set_tt_5(t5[0], t5[1], t5[2], t5[3], t5[4], t5[5], t5[6], t5[7], t5[8], t5[9], t5[10], t5[11], t5[12], t5[13], t5[14], t5[15], t5[16], t5[17], t5[18], t5[19], t5[20], t5[21], t5[22], t5[23]);
		dtv.set_tt_6(t6[0], t6[1], t6[2], t6[3], t6[4], t6[5], t6[6], t6[7], t6[8], t6[9], t6[10], t6[11], t6[12], t6[13], t6[14], t6[15], t6[16], t6[17], t6[18], t6[19], t6[20], t6[21], t6[22], t6[23]);
		dtv.set_tt_7(t7[0], t7[1], t7[2], t7[3], t7[4], t7[5], t7[6], t7[7], t7[8], t7[9], t7[10], t7[11], t7[12], t7[13], t7[14], t7[15], t7[16], t7[17], t7[18], t7[19], t7[20], t7[21], t7[22], t7[23]);
		dtv.set_tt_8(t8[0], t8[1], t8[2], t8[3], t8[4], t8[5], t8[6], t8[7], t8[8], t8[9], t8[10], t8[11], t8[12], t8[13], t8[14], t8[15], t8[16], t8[17], t8[18], t8[19], t8[20], t8[21], t8[22], t8[23]);
		dtv.set_tt_9(t9[0], t9[1], t9[2], t9[3], t9[4], t9[5], t9[6], t9[7], t9[8], t9[9], t9[10], t9[11], t9[12], t9[13], t9[14], t9[15], t9[16], t9[17], t9[18], t9[19], t9[20], t9[21], t9[22], t9[23]);
		dtv.set_tt_10(t10[0], t10[1], t10[2], t10[3], t10[4], t10[5], t10[6], t10[7], t10[8], t10[9], t10[10], t10[11], t10[12], t10[13], t10[14], t10[15], t10[16], t10[17], t10[18], t10[19], t10[20], t10[21], t10[22], t10[23]);
		all_days[0] = dtv;
	
		return all_days;
	}


In der 2. Klasse wird im Endeffekt ein bestimter Ordner nach Excel-Files durchsucht.
Sind die entsprechenden Files gefunden, werden diese mittels der while-Schleife ausgelesen und weiter verarbeitet.. Ich habe den Stück vom Code mal weggelassen.. ;-)

Über die private - Variable round_counter möchte ich jetzt meinen ProgressBar setzen.
Das tut er auch, nur leider erst, wenn die while-Schleife komplett abgearbeitet ist, so weit so gut..

Aber meine ganzen Versuche mit SwingUtilities-invokelater() und Threading funzten nicht..
Von daher würde ich mich über nen kleine Hilfestellung Eurerseits sehr freuen, damitich weiß, wie ich den ProgressBar da reinfrickeln kan..
 

Bazilinho

Mitglied
Danke für den Tipp!
Ist echt nen cooles Tutorial, was einem Einiges etwas näher bringt..

Nur leider lösts mein Problem mal so gar nicht... :noe:

Ich werde echt bekloppt!!!

Also ich habe mir den Code aus dem Tutorial genommen und etwas abgewandelt, so wie ich es von der Struktur her brauche.. Std-Alone tuts das auch 1a!!!

Java:
public class LongTask {
    private JButton btnStart;
    private JButton btnStop;
    JProgressBar progressBar;
    SwingWorker<Void, Integer> worker;
 
    
    int[] zzz = new int[4];
    
    public LongTask(String name) {
 
    	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);

   }
   


    public int[] stacht_2(){
        JFrame frame = new JFrame("longoTasko");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(progressBar);
        frame.pack();
        frame.setVisible(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);
                int i = 0;
                while (progress < 100 && !isCancelled()) {
                   
                	while (i<3) {
                		System.out.println("vlabla");
                	
                	
                	System.out.println("Test1");
                	Thread.currentThread().sleep(500);
                	System.out.println("Test2");
                	Thread.currentThread().sleep(500);
                	System.out.println("Test3");
                	Thread.currentThread().sleep(500);
                	System.out.println("Test4");
                	Thread.currentThread().sleep(500);
                	
                	
                	 progress = progress+25;
                	 zzz[i] = progress;
                	 i++;
                	 publish(progress);
                }}
                return null;
            }

            @Override
            protected void done() {
                Boolean completed = isCancelled();
                progressBar.setValue(0);
                btnStart.setEnabled(true);
                btnStop.setEnabled(false);
            }
        };
        worker.execute();
        System.out.println();
		return zzz;
    }
    
    public static void main(String[] args) {

    	LongTask lt = new LongTask("");
    	lt.stacht_2();
    }
}

Soweit der Std-Alone Code! Da bekomme ich neben den (unsinnigen) System.Outs auch meinen Progress Bar.

ABER wenn ich das so in meinen kompletten Code reinbaue bringts mir wieder gar nix...

In dem ersten Code-Schnipsel (vom Start-Posting) sieht man einen Teil der eigentlichen GUI. Hab dem ActionListener des Buttons jetzt mal die Zeilen
Java:
LongTask lt = new LongTask("");
				lt.stacht_2();
hinzugefügt. Mit anderen Worten: Hier sollte jetzt das kleine ProgressBar-Fenster erzeugt und die System.Outs geprintet werden.
Aber das ProgressBar Fenster aktualisiert sich wieder nicht..

Ich hoffe, es hat jemand nen Plan woran das liegen könnte..
 

vimar

Bekanntes Mitglied
ohne jetzt ins detail gehen zu wollen, ich denke du musst da mit "threads" arbeiten. ein thread für die gui(also u.a. progressbar) und ein thread für die berechnung. vermutlich siehts bei dir so aus das am anfang die progressbar 0% hat und dann "plötzlich" 100%. Java cookbook oder java ist auch eine insel dort über threads informieren.
 

Xeonkryptos

Bekanntes Mitglied
Vimar hat wahrscheinlich recht. Ich hab mir dein Code nicht genauer angeschaut, aber wenn du eine Rechnung laufen hast, die Zeitintensiv ist, blockiert es den EDT (In dem Thread laufen alle Events der GUI zusammen, auch die Aktualisierung der ProgressBar) und hat er gerade etwas anderes zu tun, kann er die aktuellen Events (Aktualisierung der ProgressBar zum Beispiel) nicht abarbeiten und holt das erst am Ende nach.

Du musst also deine Rechnung, die die ProgressBar anzeigen soll, in einen externen neuen Thread legen, damit der EDT für Events frei bleibt!

Immer merken: Rechenintensive Rechnungen IMMER(!) in einen extra Thread packen und dort ausführen lassen, damit der EDT für alle weiteren Events frei bleibt und kein Bug-Verhalten auftritt!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N wert für progress auf 100% setzen Java Basics - Anfänger-Themen 5
T Progress Bar Java Basics - Anfänger-Themen 20
K Serialisieren mit Progress Java Basics - Anfänger-Themen 2
G Daten laden - progress Java Basics - Anfänger-Themen 4
B JaxB - Unique Name updaten / Referenzen in XML Java Basics - Anfänger-Themen 0
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
C ProgressBar updaten Java Basics - Anfänger-Themen 4
M Jtable änderung updaten Java Basics - Anfänger-Themen 2
T OOP GUI aus anderer Klasse updaten Java Basics - Anfänger-Themen 6
E Gui updaten während langer Methode Java Basics - Anfänger-Themen 2
E JTable + TableModel updaten? Java Basics - Anfänger-Themen 1
G drawString/ JLabel updaten Java Basics - Anfänger-Themen 1
H java version updaten Java Basics - Anfänger-Themen 11
G JFreeChart | Plot updaten bei neuem Dataset | wahrscheinlich "Thread-abhängig" Java Basics - Anfänger-Themen 3
J Servertime updaten Java Basics - Anfänger-Themen 4
Screen Threads Wie thread stoppen/closen ? und wie GUI at runntime updaten? Java Basics - Anfänger-Themen 10
S JFRAME updaten Java Basics - Anfänger-Themen 6
J arraylist ausserhalb der main Methode zugänglich machen (Elemente adden und updaten) Java Basics - Anfänger-Themen 4
G JList updaten Java Basics - Anfänger-Themen 7
T Bei Struts Beans updaten ohne ein Request zu verarbeiten Java Basics - Anfänger-Themen 4
MegaWatt Wie Applet mit Timer updaten, warum 2. Thread ? Java Basics - Anfänger-Themen 5
M JTable updaten woran liegt es bloß? Java Basics - Anfänger-Themen 2
J Dateien in JAR-Datei updaten Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben