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... 😳

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..
 
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..
 
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.
 
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!
 

Zurück
Oben