Erste Schritte Label Text vor Methodenaufruf setzen

fetcher

Mitglied
Hallo liebes Forum,
ich habe ein kleines Problem beim setzen eines Textes bevor eine bestimmte Methode aufgerufen wird.

Es handelt sich dabei um ein Status-Text in Form eines JLabels.
Beim Button-Klick müsste ein StatusText gesetzt werden bevor die Methode ("einlesen()") aufgerufen wird. Da der Code ja immer von oben nach unten ausgeführt wird wundert es mich, dass der Text nicht gesetzt wird.

Die Methode einlesen() nimmt ein wenig Zeit in Anspruch, daher sollte auch der Status-Text gesetzt werden. Sobald ich den Methodenaufruf auskommentiere, setzt er den Text wieder ganz normal.

Hat jemand eine Idee?

Vielen Dank,
Gruß
fetcher
 
Hi Gucky,
hier der Code:

Java:
JButton btnGet = new JButton("GET");
	    btnGet.addActionListener(new ActionListener() 
	    {
	    	public void actionPerformed(ActionEvent e) 
	    	{
	    		
	    		lblStatusAnzeige.setText("Bücher werden eingelesen...");
	    		
    			einlesenFirst();
	    		
	    		DefaultTableModel modelNeu = getTableAll();
				
				table.setModel(modelNeu);
				table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
				table.getColumn("Name").setPreferredWidth(590);
				
				//lblAnzTreffer.setText(""+anzahlTreffer);
				lblAnzahl.setText("" + NumberFormat.getInstance().format(anzahlBuecher));
				
				lblStatusAnzeige.setText("Alle Bücher erfolgreich eingelesen!");

	    	}
	    });
	    btnGet.setBounds(587, 49, 53, 29);
	    frame.getContentPane().add(btnGet);

Beim Klick auf den Button wird mir nur der Text nach dem einlesen angezeigt. Also "Alle Bücher erfolgreich eingelesen!"

Aber der Status "Bücher werden eingelesen..." wird nicht angezeigt.

Hast du eine Idee?
 
Vielleicht geht das so schnell, dass du es nicht sehen kannst, wie der erste Text eingelesen wird?
Setz mal einen Breakpoint nach dem Setzen des Textes und guck dir dann das Label an.
wird das aus einem anderen Thread als dem GUI-Thread ausgeführt?
 
Was die Geschwindigkeit betrifft kann man das schon mal ausschließen. Das einlesen dauert ca. 10-15 Sekunden.
Ich habe mal einen Breakpoint gesetzt und festgestellt, dass das Label nicht gesetzt wird. Das setzen passiert im GUI-Thread.

Sobald ich ein println("Buecher werden eingelesen...") mache, dann wird mir das in der Konsole richtig angezeigt. Nur das setzes des Label's funzt nicht :-( .
 
Und wenn du das Einlesen auskommentierst funktioniert es? Wenn du alles so lässt und nur das Einlesen auskommentierst?
 
Genau, dann gehts. Kapier das echt nicht mehr.. der Code wird doch immer von oben nach unten ausgeführt. D.h. er muss ja setText machen, bevor die Methode "einlesenFirst()" aufgerufen wird.
 
Genau er wird nicht angezeigt :-( . Ein prinln("..wird eingelesen") zeigt er in der Konsole an und sobald alle Zeilen eingelesen worden sind, gibt er mit über prinln() auch wieder "Erfolgreich angezeigt" aus.
 
Kann man vielleicht irgendwie abfragen ob ein label erfolgreich gesetzt wird und true oder false zurückliefert oder ein delay timer einbauen der 5 sekunden abwartet bevor es weiter geht?
 
Den Timer einzubauen ist kein Problem. Thread.sleep(5000) wartet 5 Sekunden aber das bringt nichts, weil der GUI Thread damit angehalten wird.

Aber ich habe zwei Ideen:
  • Du schreibst repaint() hinter den Aufruf von setText(), was aber nicht funktionieren muss, oder
  • Du verfrachtest das Einlesen in einen eigenen Thread, was sowieso viel besser ist, weil dann nicht das GUI für die Zeit des Einlesens blockiert ist.

Da komme ich erst jetzt drauf, weil du nach der Verzögerung gefragt hast:
Der GUI Thread ist für das Neuzeichnen des GUI zuständig und sollte darüber hinaus nichts tun, was länger dauert, weil er sonst das GUI nicht neu zeichnen kann.
Das kannst du mit einem Arbeiter vergleichen. Dieser Arbeiter hat zwei Stapel von Aufgaben. Der Eine wird dann abgearbeitet, wenn er Zeit hat. Der Andere wird sofort abgearbeitet.
Auf dem Ersten liegt nur eine Aufgabe: Neuzeichnen des GUI
Auf dem Anderen liegt alles Andere.
 
Vielen Dank für deine Hilfe. Kannst du mir ein Beispiel dazu geben? Bin nämlich noch ziemlicher Anfänger. Das repaint hat nicht funktioniert.
 
Das repaint() nicht funktioniert, habe ich mir gedacht.

Multithreading ist ein Thema, zu dem tausende Tutorials im Internet kursieren. Ich muss nicht den Speicher vom Java Forum mit einem Weiteren zumüllen. 😉

Ich gebe dir als Stichworte: Thread und Eventhandling.
Mit diesen drei Stichworten solltest du schon einmal sehr weit kommen.
Wenn du dann immer noch Probleme hast, dann melde dich wieder und ich werde sehen, was ich tun kann 😉
Aber einen Tipp habe ich noch: Überleg dir zuerst, wie du den Thread und das Eventhandling zu benutzen planst, poste dies und ich gucke da noch mal drüber. Dabei kann man nämlich noch einen doofen Fehler machen. Ich spreche aus Erfahrung 😉
Diese Erfahrung möchte ich dir aber nicht nehmen, weshalb ich sie dir nicht poste.
 
Hallo, ich habe es nun hinbekommen *freu*. Habe jetzt "EventQueue.invokeLater(new Runnable()" verwendet. Damit gehts..

Das ist jetzt mein Code

Java:
JButton btnGet = new JButton("GET");
	    btnGet.addActionListener(new ActionListener() 
	    {
	    	public void actionPerformed(ActionEvent e) 
	    	{
	    		
	    		lblStatusAnzeige.setText("Bücher werden eingelesen...");
	    		
	    		EventQueue.invokeLater(new Runnable()
	    		{
	    			public void run()
	    			{
	    				try
	    				{
	    					einlesenFirst();
	    					
	    					DefaultTableModel modelNeu = getTableAll();
	    					
	    					table.setModel(modelNeu);
	    					table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	    					table.getColumn("Name").setPreferredWidth(590);
	    					
	    					lblAnzahl.setText("" + NumberFormat.getInstance().format(anzahlBuecher));
	    					
	    					lblStatusAnzeige.setText("Alle Bücher erfolgreich eingelesen!");
	    				
	    				} catch (Exception e)
	    				{
	    					e.printStackTrace();
	    				}
	    			}
	    		});
	    		
	    	}
	    });
	    btnGet.setBounds(587, 49, 61, 29);
	    frame.getContentPane().add(btnGet);
 

Zurück
Oben