Swing Verzögerung beim Hinzufügen / Ändern von Swingkomponenten

Erwisch

Neues Mitglied
Hallöle,

Ich muss für die Uni eine graphische Benutzeroberfläche mit Java programmieren. Ich will gleich vorweg anmerken, dass ich von Java eigentlich nicht allzuviel verstehe und nur einen Programmierschein hinbekommen muss und daher eher Befehle zusammenkopiere ohne viel zu verstehen (ja ich weiß das ist eigentlich nicht gut aber mir fehlt die Zeit das jetzt vernünftig zu lernen).

Mein Problem lässt sich eigentlich darauf reduzieren, dass ich beispielsweise einen Label anzeigen möchte, dann ein paar Sekunden nichts passiert und dann der Label geändert wird. Ich hab das auch erstmal mit thread.sleep hinbekommen. Allerdings will ich nun noch zusätzlich, dass das ganze bei einem Klick auf nen Button geschieht und dort funktioniert das dann irgendwie nicht mehr. Kann mir da jemand weiterhelfen?


Hier mal nen Beispielcode mit dem Problem:

Java:
package fischi;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final JFrame f = new JFrame("Test");
		f.setLayout(null);		
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(500, 500);
		
		final JButton button = new JButton("los gehts");
		button.setSize(200, 50);
		button.setLocation(50, 30+50);
		
		ActionListener bs = new ActionListener() { 
			  @Override public void actionPerformed( ActionEvent e ) { 
				  JLabel b = new JLabel ("Hallo");
					b.setSize(400, 50);
					b.setLocation(50, 10);
					f.add(b);
				
					Thread t = Thread.currentThread();
					  try{
						  Thread.sleep(1000);
					  }
					  catch(InterruptedException x) {
						  
					  }
					
					b.setText("und nun");
					
				  } 
			};			 
			button.addActionListener( bs ); 	
		f.add(button);
		f.setVisible(true);
	}
	
	

}


Bei dem Beispiel ist es dann so, dass sofort "und nun" angezeigt wird. Das sollte halt erst nach ner Sekunde passieren. Ich danke schonmal 🙂

lg
 
solange der ActionListener ausgeführt wird, ist die GUI blockiert, kann nicht neu gezeichnet werden,
längerfristige Aktionen gehören in einen nebenläufigen Thread, z.B.

Java:
actionPerformed() {
  new Thread() {
     public void run() {
        // hier Code einfügen
     }
  }.start();
}
 
Hi,

ohne genau zu wissen warum es bei dir nicht funktioniert kann ich generell sagen: Für Swing ist die Klasse Timer empfohlen. Als Stichwort für deine Fehlersuche würde ich EventDispatchThread und "Threadsicherheit von Swing-Komponenten" vorschlagen.

Gruß!
 
Habe mich mit der Materie bisher auch nicht intensiv beschäftigt, aber das scheint wohl deinem Wunsch zu entsprechen:
Java:
			@Override
			public void actionPerformed(ActionEvent e) {
				final JLabel b = new JLabel("Hallo");
				b.setSize(400, 50);
				b.setLocation(50, 10);
				f.add(b);
				f.validate();
				f.repaint();

				Thread t = Thread.currentThread();
				new SwingWorker<Void, Void>() {
					@Override
					protected Void doInBackground() throws Exception {
						Thread.sleep(1000);
						b.setText("und nun");
						return null;
					}
				}.execute();
			}
Beachte, dass du immer wieder ein neues JLabel erstellst und hinzufügst.
 

Zurück
Oben