Progress Bar wird erst zu spät ganz angezeigt

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

Java:
...

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):

Java:
	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
Java:
this.guiStart.button1().addActionListener(new ActionListener() 
	    {
	    	//Englisch
	    	public void actionPerformed(ActionEvent evt) 
	    	{
	    		new Main(10000, 0);
	    		guiStart.dispose();
	    	}
	    });




Ansonsten funktioniert alles einwandfrei. =(

Lurchi
 
Edit:

Ihr braucht auf jeden Fall einen edit Button :D

edit2: ooh sorry, war noch nicht aktiviert :oops:

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:
 
S

SlaterB

Gast
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

Java:
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();
    }
}
 
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:

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

Anstatt einfach nur
Java:
	    		    		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. :)
 
S

SlaterB

Gast
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
TobiasN Wer Wird Millionär Spiele- und Multimedia-Programmierung 4
B Bild wird nicht geladen Spiele- und Multimedia-Programmierung 4
R JPanel wird erst im Fullscreen angezeigt Spiele- und Multimedia-Programmierung 1
K Das Leerzeichen der Tastatur wird nicht gleichgesetzt mit dem Leerzeichen aus der Text Datei Spiele- und Multimedia-Programmierung 5
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
J OpenGL Bild wird nicht richtig angezeigt Spiele- und Multimedia-Programmierung 2
S GetBufferStrategy-Methode wird nicht angezeigt Spiele- und Multimedia-Programmierung 6
G Wer wird Millionär / Fragefenster Spiele- und Multimedia-Programmierung 6
L Transparenz wird magenta Spiele- und Multimedia-Programmierung 3
Polarfuchs Status von Midi Datei(wird gerade abgespielt oder nicht) Spiele- und Multimedia-Programmierung 0
A Bild(sequenz) wird nicht geladen Spiele- und Multimedia-Programmierung 1
F 4 Gewinnt - Code wird ignoriert Spiele- und Multimedia-Programmierung 7
C Mein Programm wird sofort terminated Spiele- und Multimedia-Programmierung 8
A [LWJGL] BMP Textur wird nicht richtig dargestellt Spiele- und Multimedia-Programmierung 8
S LWJGL Rechteck wird nicht gezeichnet Spiele- und Multimedia-Programmierung 6
J Versch. Pfeiltasten angezeigt obwohl nur 1 gedrückt wird Spiele- und Multimedia-Programmierung 2
Creylon [LWJGL] Textur wird falsch angezeigt Spiele- und Multimedia-Programmierung 12
S Nur den Bereich des JPanels zeichen der im Viewport des JScrollPane angezeigt wird Spiele- und Multimedia-Programmierung 8
Q BufferedImage vs. Heap Space ‒ Warum wird der Speicher nicht freigegeben? Spiele- und Multimedia-Programmierung 6
M Karte wird falsch gezeichnet Spiele- und Multimedia-Programmierung 9
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
C Alles hängt, wenn ein Sound abgespielt wird Spiele- und Multimedia-Programmierung 9
K Transformation wird nicht angewendet Spiele- und Multimedia-Programmierung 3
A Wie wird die Person im Game animiert, dass sie ihre Körperteile bewegen? Spiele- und Multimedia-Programmierung 3
A Shape Geometry, wird nicht angezeigt Spiele- und Multimedia-Programmierung 6
D Jogl:Textur auf GLUquadric wird vertikal spiegelverkehrt dargestellt Spiele- und Multimedia-Programmierung 2
M Java Textadventure HashMap wird nicht befüllt? Spiele- und Multimedia-Programmierung 7
P [JMF] Webcam wird nicht gefunden Spiele- und Multimedia-Programmierung 3
P Erkennen auf welche Objekte gezeigt wird in JoGL Spiele- und Multimedia-Programmierung 6
Steev KeyPressed:Tab wird nicht mehr weitergeleitet Spiele- und Multimedia-Programmierung 2
J JOGL - Bild wird immer wieder weiß Spiele- und Multimedia-Programmierung 2
0x7F800000 weiß einer wozu ANTLR beim build von JOGL verwendet wird? Spiele- und Multimedia-Programmierung 3
J MenuBar wird bei Spiel nicht angezeigt Spiele- und Multimedia-Programmierung 5
L Frame wird geöffnet es wird aber nix angezeigt Spiele- und Multimedia-Programmierung 2
R Die korrekte Breite/Höhe eines Bildes wird nicht erkannt. Spiele- und Multimedia-Programmierung 2
P JOGL: mit glTranslated wird nichts gezeichnet Spiele- und Multimedia-Programmierung 3
F Szene wird nicht komplett angezeigt (Tiefenproblem?) Spiele- und Multimedia-Programmierung 2
G Fragespiel, Hilfe ! like Wer wird Millinär Spiele- und Multimedia-Programmierung 12
M 1. Menüleiste wird doppelt gezeichnet 2. awt auf ein jpanel Spiele- und Multimedia-Programmierung 4
F WakeupOnAWTEvent wird ignoriert! Spiele- und Multimedia-Programmierung 2
C BackgroundSound wird nicht abgespielt Spiele- und Multimedia-Programmierung 3
dummycoders Android Studio - Button ändert Farbe erst nach Delay? Spiele- und Multimedia-Programmierung 5
R Java3d ViewingPlatform erst Verschieben und dann RotationsInterpolator Spiele- und Multimedia-Programmierung 0

Ähnliche Java Themen


Oben