# Progress Bar wird erst zu spät ganz angezeigt



## LurchiDerLurch (29. Sep 2010)

Vorab: *Ja*, die Progress Bar und die Anwengungen laufen in zwei verschiedenen Threads.

So nun. Es geht um ein Programm, was im Rahmen eines Projekts für die Schule geschrieben wurde. Das sollte jetzt bald fertig werden aber es hapert am Sahnehäupchen ^^

Das Programm greift am Anfang auf eine nicht geringe Menge an Daten aus einer Datenbank zurück. Dieser Vorgang dauert eine Zeit und dem Benutzer sollte veranschaulicht werden, dass was passiert. Dafür hab ich jetzt folgendermaßen eine Progress Bar implementiert:

*Klasse Main*


```
...

Thread progressThread = new Thread(new Runnable() 
	  {
	       public void run() 
	       {
			  JProgressBar pb = new JProgressBar(0,100);
			  pb.setPreferredSize(new Dimension(175,20));
			  pb.setString("Working");
			  pb.setStringPainted(true);
			  pb.setValue(0);
			  pb.setIndeterminate(true);
			
			  JPanel center_panel = new JPanel();
			  center_panel.add(pb);
			  
			  JDialog dialog = new JDialog((JFrame)null, "Working ...");
			  dialog.add(center_panel, BorderLayout.CENTER);
			  dialog.pack();
			  dialog.setVisible(true);
			  
			  Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
			  dialog.setLocationRelativeTo(null); // center on screen
			  dialog.setLocation((dim.width - dialog.getSize().width) / 2,(dim.height - dialog.getSize().height) / 2); // position by coordinates
			  dialog.toFront(); // raise above other java windows
		   		
				while(!Thread.currentThread().interrupted())
				{
					try 
					{
						Thread.sleep(20);
					}
					catch (InterruptedException e) 
					{
						dialog.dispose();
						Thread.currentThread().interrupt();
					}
					
					pb.repaint();
					
					System.out.println("Ich lebe");
				}
	       }    
	  });

progressThread.start();

...Datenbank...
```

Dad funktioniert jetzt, wenn ich die Klasse über Eclipse starte (Daten werden aus der Datenbank geholt und "Ich lebe" parallel auf der Konsole ausgegeben):


```
public static void main(String[] args) 
	{
		new Main(10000, 0);
	}
```

Aber sobald ich das gleiche über eine andere Klasse mache (nämlich über einen Button), wird nur der Dialog ohne Progress Bar angezeigt (siehe Bilder im Anhang). Sobald die Datenbank dann fertig ist, wird auch der Progress Bar ganz angezeigt:

*Klasse Start*

```
this.guiStart.button1().addActionListener(new ActionListener() 
	    {
	    	//Englisch
	    	public void actionPerformed(ActionEvent evt) 
	    	{
	    		new Main(10000, 0);
	    		guiStart.dispose();
	    	}
	    });
```






Ansonsten funktioniert alles einwandfrei. =(

Lurchi


----------



## LurchiDerLurch (29. Sep 2010)

Edit:

Ihr braucht auf jeden Fall einen edit Button 

edit2: ooh sorry, war noch nicht aktiviert 

Hab gerade rausgefunden, dass es am Button liegt. Wenn ich die Main Klasse im Konstruktor von der Klasse Start erzeuge, geht es auch. Liegt also daran, dass ich das über den Button starte :bahnhof:


----------



## SlaterB (29. Sep 2010)

besteht noch eine Frage?
ich wüßte bei mir nicht, wie ich das zum nicht-funktionieren bringen könnte,

modal true/false kann bei Dialogen Ärger machen, aber hast du in deinem Code nicht drin,
und sollte von main aus genauso reagieren wie von einem Button aus


```
public class TestGUI
    extends JFrame
{

    public TestGUI()
    {
        JButton b = new JButton("Start");
        b.addActionListener(new ActionListener()
            {

                public void actionPerformed(ActionEvent e)
                {
                    Thread progressThread = new Thread(new Runnable()
                        {
                            public void run()
                            {
                                JProgressBar pb = new JProgressBar(0, 100);
                                pb.setPreferredSize(new Dimension(175, 20));
                                pb.setString("Working");
                                pb.setStringPainted(true);
                                pb.setValue(0);
                                pb.setIndeterminate(true);

                                JPanel center_panel = new JPanel();
                                center_panel.add(pb);

                                JDialog dialog = new JDialog((JFrame)null, "Working ...");
                                dialog.setModal(false);
                                dialog.add(center_panel, BorderLayout.CENTER);
                                dialog.pack();
                                dialog.setVisible(true);

                                Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
                                dialog.setLocationRelativeTo(null); // center on screen
                                dialog.setLocation((dim.width - dialog.getSize().width) / 2,
                                                   (dim.height - dialog.getSize().height) / 2);
                                dialog.toFront();

                                while (!Thread.currentThread().interrupted())
                                {
                                    try
                                    {
                                        Thread.sleep(200);
                                    }
                                    catch (InterruptedException e)
                                    {
                                        dialog.dispose();
                                        Thread.currentThread().interrupt();
                                    }
                                    pb.repaint();
                                    System.out.println("Ich lebe");
                                }
                            }
                        });

                    progressThread.start();
                }
            });
        add(b);


        setSize(200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        new TestGUI();
    }
}
```


----------



## LurchiDerLurch (29. Sep 2010)

Ich konnte mir das ja auch nicht erklären. Wies der Zufall so will hab ich jetzt aber die Lösung gefunden (war klar gestern und heut die ganze Zeit gesucht und jetzt wo ich hier gefragt hab find ich die Lösung :lol

Naja in den Action Listener vom Button das rein:


```
Thread thread = new Thread(new Runnable() 
	    		  {
	    		       public void run() 
	    		       {
	    		    		Main main = new Main();
	    		    		main.init(10000, 0);
	    		    		guiStart.dispose();
	    		       }    
	    		  });
	    		  
	    		  thread.start();
```

Anstatt einfach nur 

```
Main main = new Main();
	    		    		main.init(10000, 0);
	    		    		guiStart.dispose();
```

Kann sich das jemand erklären wieso das nur mit einem weiteren Thread geht ???:L

Ach ja. Daran, dass ich alles aus dem Konstruktor von der Main Klasse raus hab und eine init() eingeführt, liegt es nicht.


Vielen Dank dass du dir trotzdem Zeit genommen hast.


----------



## SlaterB (29. Sep 2010)

was macht denn dieses Main(10000) oder init(10000)?
werden dort neben dem Start des Dialog-Threads noch andere Aktionen durchgeführt, etwa die Daten geladen?

dann ist der Fall klar, solange Main arbeitet ist der ActionListener nicht beendet, und solange der nicht beendet ist,
ist der AWT-Thread, der sich ums Zeichnen kümmert, blockiert,

grundsätzlich muss jede längerfristige Aktion nebenläufig ausgeführt werden, dafür ein Thread,
wenn nebenbei eine Schleife beobachten soll, dann ist das der zweite Thread


----------



## LurchiDerLurch (29. Sep 2010)

SlaterB hat gesagt.:


> dann ist der Fall klar, solange Main arbeitet ist der ActionListener nicht beendet, und solange der nicht beendet ist,
> ist der AWT-Thread, der sich ums Zeichnen kümmert, blockiert,



Das ist dann wohl die Antwort. Wieder was gelernt, danke


----------

