JLabel Ausgabe

Jay-Dee

Neues Mitglied
Hallo, ich hab ein Problem mit einer Ausgabe auf einem JLabel.
Und zwar, wenn ich lauf() in der main starte werden mir alle Zahlen nacheinander von 1-99 angezeigt. Nun möchte ich diese aber erst über einen Button aufrufen und hier das Problem, mir werden nun die zahlen nicht mehr angezeigt nur am Ende die 99. Kann mir dabei jemand helfen und erklären warum das so ist, oder wie ich das umgehen kann das ich wieder alle Zahlen angezeigt bekomme?
Danke schonmal 🙂

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

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

public class aktFrame {
static JFrame frame = new JFrame();
final static JLabel lblNewLabel = new JLabel("new Label");


public static void main(String[]args){
//	final aktFrame af = new aktFrame();
	ini();
//	af.lauf();

}

private static void ini() {
	frame.setBounds(250, 250, 389, 169);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.getContentPane().setLayout(null);
	frame.setVisible(true);
	JPanel panel = new JPanel();
	frame.getContentPane().add(panel);
	lblNewLabel.setBounds(10, 23, 231, 60);
	frame.getContentPane().add(lblNewLabel);

	JButton btnNewButton = new JButton("New button");
	btnNewButton.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			aktFrame af=new aktFrame();
			af.lauf();
		}
	});

	btnNewButton.setBounds(268, 42, 89, 23);
	frame.getContentPane().add(btnNewButton);
}

void lauf(){
	for (int i=0; i<100; i++){
		lblNewLabel.setText(""+i);
	//	frame.repaint();
		try { Thread.sleep(50);
		}catch(Exception e){}
	}
}


}
 
Oha, also erst einmal gehe ich auf deine Frage ein.
Es gibt einen GUIThread (EDT) der für das Zeichnen und Darstellen der GUI zuständig ist. In diesem Thread, bzw. dieser Thread arbeitet auch immer automatisch den Code der Listener ab, in deinem Beispiel also auch dann die lauf() Methode. Das Thread.sleep bezieht sich ebenso auf diesne Thread, d.h. du gibst zu keiner Zeit diesem Thread die Möglichkeit die GUI neu zu zeichnen bzw. den Labeltext zu ändern (ganz grob beschrieben).
Das ist auch der Grund warum Listenercode immer kurz und knapp sein soll. hast du eine längere Aktion, solltest du diese in einen neuen Thread auslagern, z.B.:
Java:
btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				final aktFrame af = new aktFrame();
				new Thread(new Runnable() {
					@Override
					public void run() {
						af.lauf();
					}
				}).start();
			}
		});

Andere Anmerkungen:
- class aktFrame -> Klassennamen beginnen nach Konvention vorn mit einem Großbuchstaben
-wieso erstellst du in deinem Listenercode ein neues aktFrame-Objekt? Vlt. solltest du dich erst einmal noch in die Grundlagen von Java ein wenig :rtfm:, vor allem was static bedeutet usw.
-lblNewLabel.setBounds(10, 23, 231, 60); ist auch übel, denn je nach Auflösung wird der Buttontext jetzt teilweise abgeschnitten unter Umständen.
- frame.setVisible(true); am Besten erst ganz am Ende aufrufen
 
Hallo, danke für die schnelle Antwort.
Ich werd mich gleich dran setzten.

Ja ich bin noch ein blutiger Anfänger in Java. 😳
Das mit den Konventionen kenn ich 🙂 , war mir aber hier gerade nicht so wichtig, da ich das nur ganz schnell so dahin getippt habe, denn ich bin gerade an was anderem dran, in dem ich genau diese Ausgabe mit dem Label brauche und das hier war nur mal so was simples was das auch machen soll.

Werde mich beim nächsten daran halten 🙂

Lieben Dank:toll:
 

Neue Themen


Zurück
Oben