# ProgressBar in ActionListener



## Michael_FeM (15. Aug 2012)

Liebe Java-Gemeinde,

ich stehe schon seit Tagen vor folgendem Problem. Ich möchte über einen Button einen Filechooser starten und nach Auswahl der Datei soll ein ProgressBar den Status anzeigen. 

Problem:

Während die Datei gelesen wird, bleibt die Anzeige des ProgressBar unverändert und erst nachdem die Datei eingelesen ist springt die Anzeige auf 100%. Woran kann das liegen?

Hier mein Code:



```
final JProgressBar progressBar = new JProgressBar();
      	panel.add(progressBar);  
	  	progressBar.setStringPainted(true);


	    final JButton choose = new JButton("Coe");
	    panel.add(choose);

	    choose.addActionListener(new ActionListener() 
		{
	      public void actionPerformed(ActionEvent ae) 
		  {
	    	JFileChooser fileChooser = new JFileChooser();
	        int returnValue = fileChooser.showOpenDialog(null);
	        if (returnValue == JFileChooser.APPROVE_OPTION) 
			{
	          File selectedFile = fileChooser.getSelectedFile();
	          try {
		  	    	int i = 0;
		  	    	int p = 0;
		  			BufferedReader in = new BufferedReader(new FileReader(selectedFile));
		  			String zeile = null;
		  			while ((zeile = in.readLine()) != null)
		  			{
		  				try
		                {
		  					
		                  System.out.println(count);
		                  p = (int)((100 * i)/512);  
			  			  progressBar.setValue(p);	   //Hier wird die ProgressBar aufgerufen		  			  
		                  Thread.sleep(250);		               
		                }
		                catch (InterruptedException e)
		                {}		  				
		  		                i++;		  				  				
			                    System.out.prinln("Zeileninhalt = " + zeile);
			        	  
		  			}
		  		} 
	          catch (IOException e) 
				{
		  			e.printStackTrace();
		  		}       
	        }
	      }
	    });
```




Gruß,
Michael


----------



## Camino (15. Aug 2012)

Michael_FeM hat gesagt.:


> Während die Datei gelesen wird, bleibt die Anzeige des ProgressBar unverändert und erst nachdem die Datei eingelesen ist springt die Anzeige auf 100%. Woran kann das liegen?



Vermutlich weil bei Swing so ziemlich alles im EDT-Thread abläuft und sich manche Sachen dadurch blockieren können. Für so etwas wie das Einlesen der Datei und die Progressbar müsstest du dann wohl mit SwingWorker einen eigenen Thread benutzen. Bin da gerade selbst am Rumprobieren, deshalb kann ich dir da jetzt keinen konkreten Code zeigen. Aber im Internet findest du dazu einge Beispiele.


----------



## Michael_FeM (15. Aug 2012)

Des Rätsels Lösung: Man muss die ProgressBar in einem Thread ausführen.
Hier der Code:


```
choose.addActionListener(new ActionListener() 
	    {
	        public void actionPerformed(ActionEvent e) 
	        {
	        	 new Thread() 
	        	 {
	                 public void run() 
	                 {
	                		{
	                			JFileChooser fileChooser = new JFileChooser();
	                		    int returnValue = fileChooser.showOpenDialog(null);
	                		    if (returnValue == JFileChooser.APPROVE_OPTION);  
	                			File selectedFile = fileChooser.getSelectedFile();	                	    
	                	         try{
	                	     		  	    	int i = 0;
	                	     		  	    	int p = 0;
	                	     		  			BufferedReader in = new BufferedReader(new FileReader(selectedFile));
	                	     		  			String zeile = null;
	                	     		  			while ((zeile = in.readLine()) != null)
	                	     		  			{
	                	     		  				try
	                	     		                {
	                	     		  					
	                	     		                  System.out.println(count);
	                	     		                  p = (int)((100 * i)/512);
	                	     			  			  progressBar.setValue(p);
	                	     		                  Thread.sleep(250);		               
	                	     		                }
	                	     		                catch (InterruptedException e)
	                	     		                {
	                	     		                  
	                	     		                }		  				
	                	     		  				i++;		  			
	                	     		  				String hexcount = Integer.toHexString(i);
	                	     		  				System.out.println(hexcount + " " + zeile);
        		  
	                	     			        	  }
	                	     			        	  
	                	     		  			}
	                	     		  		} 
	                	            catch(Exception ex) 
	                	            {
	                	              ex.printStackTrace();
	                	            }
	                	         }
	                 }
	               }.start();
	 }});
```

Gruß,
Michael


----------



## Camino (15. Aug 2012)

Michael_FeM hat gesagt.:


> Des Rätsels Lösung: Man muss die ProgressBar in einem Thread ausführen.



Sagte ich doch...


----------



## Michael_FeM (15. Aug 2012)

Stimmt


----------

