Guten Tag,
ich hab ein kleines Programm erstellt, welches beim Betätigen eines Knopfes einen Zählerstand um 1 inkrementiert. Für die GUI habe ich Java Swing verwendet. Nun wollte ich, dass beim Betätigen des Knopfes der Zählerstand - langsam - hochzählt. Dafür hab ich eine For-Schleife implementiert und die Sleep Methode aufgerufen.
Das Problem ist, dass das Label sich nicht aktualisiert. Er zählt bis zur gewünschten Zahl und wartet pro Schleifendurchgang die angegebene Zeit. Nur das Label wird nicht aktualisiert. Was mach ich falsch?
Freundliche Grüße
P.S.: Jegliche weitere Kritik, die beim Überfliegen des Codes euch in den Kopf schießt, könnt ihr mir gerne mitteilen.
Der Code;
[CODE lang="java" title="Zaehler" highlight=""69-81""]package actionListenerJT;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
// Es wird eine Klasse Zaehler erstellt, die eine Sub-Klasse von JFrame
// ist und das ActionListener Interface implementiert
public class Zaehler extends JFrame implements ActionListener {
// Attribute
private JButton knopfZumBeenden;
private JButton zaehlerKnopf;
private JLabel label;
private JPanel panel;
private int gezaehlteZahl = 0;
// Konstruktur
public Zaehler (){
// Das erstellte Objekt ist mit der Super-Klasse JFrame automatisch
//ein Frame und soll einen Namen bekommen
// Die Groesse des Fensters soll festgelegt werden
this.setTitle("ActionListener Beispiel");
this.setSize(400, 100);
// Panel wird erzeugt für die Knoepfe
panel = new JPanel();
// JLabel-Objekt wird erzeugt und beschriftet
label = new JLabel();
label.setText("Zaehlerstand: " + String.valueOf(gezaehlteZahl));
//Knoepfe werden erzeugt und beschriftet
knopfZumBeenden = new JButton ("Beenden");
zaehlerKnopf = new JButton("Drueck mich fuer +1");
//Knoepfe werden dem ActionListener zugeordnet
zaehlerKnopf.addActionListener(this);
//benoetigt als Eingabeparameter ein Objekt mit dem Interface ActionListener
knopfZumBeenden.addActionListener(this);
//benoetigt als Eingabeparameter ein Objekt mit dem Interface ActionListener
//Knoepfe werden dem JPanel hinzugefügt
panel.add(knopfZumBeenden);
panel.add(zaehlerKnopf);
// Label wird dem Panel hinzugefügt
panel.add(label);
// Panel wird dem Objekt (das als Sub-Klasse vom JFrame
//automatisch ein Frame ist) hinzugefügt
this.add(panel);
this.setVisible(true);
}
// Methode
// Mit dem ActionListener Interface muss die Methode actionPerformed
//implementiert werden!
// Wird einer der Knoepfe gedrueckt, wird ein ActionEvent-Objekt erstellt:
// knopfBetaetigung
// Die Referenz auf das Objekt wird als Parameter uebergeben
public void actionPerformed (ActionEvent knopfBetaetigung){
// Ist das erstellte Objekt knopfBetaetigung der zaehlerKnopf,
//soll die gezaehlte Zahl um 1 erhoeht werden
//Dann soll der Label-Text die gezaehlte Zahl ausgeben
if (knopfBetaetigung.getSource() == this.zaehlerKnopf) {
for (int i = 1; i <= 3; i++ ){
gezaehlteZahl = i;
label.setText("Zaehlerstand: " + String.valueOf(gezaehlteZahl));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Ist das erstellte Objekt knopfBetaetigung der knopfZumBeenden,
// soll das Fenster geschlossen werden
else if (knopfBetaetigung.getSource() == this.knopfZumBeenden) {
System.exit(0);
}
}
}[/CODE]
ich hab ein kleines Programm erstellt, welches beim Betätigen eines Knopfes einen Zählerstand um 1 inkrementiert. Für die GUI habe ich Java Swing verwendet. Nun wollte ich, dass beim Betätigen des Knopfes der Zählerstand - langsam - hochzählt. Dafür hab ich eine For-Schleife implementiert und die Sleep Methode aufgerufen.
Das Problem ist, dass das Label sich nicht aktualisiert. Er zählt bis zur gewünschten Zahl und wartet pro Schleifendurchgang die angegebene Zeit. Nur das Label wird nicht aktualisiert. Was mach ich falsch?
Freundliche Grüße
P.S.: Jegliche weitere Kritik, die beim Überfliegen des Codes euch in den Kopf schießt, könnt ihr mir gerne mitteilen.
Der Code;
[CODE lang="java" title="Zaehler" highlight=""69-81""]package actionListenerJT;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
// Es wird eine Klasse Zaehler erstellt, die eine Sub-Klasse von JFrame
// ist und das ActionListener Interface implementiert
public class Zaehler extends JFrame implements ActionListener {
// Attribute
private JButton knopfZumBeenden;
private JButton zaehlerKnopf;
private JLabel label;
private JPanel panel;
private int gezaehlteZahl = 0;
// Konstruktur
public Zaehler (){
// Das erstellte Objekt ist mit der Super-Klasse JFrame automatisch
//ein Frame und soll einen Namen bekommen
// Die Groesse des Fensters soll festgelegt werden
this.setTitle("ActionListener Beispiel");
this.setSize(400, 100);
// Panel wird erzeugt für die Knoepfe
panel = new JPanel();
// JLabel-Objekt wird erzeugt und beschriftet
label = new JLabel();
label.setText("Zaehlerstand: " + String.valueOf(gezaehlteZahl));
//Knoepfe werden erzeugt und beschriftet
knopfZumBeenden = new JButton ("Beenden");
zaehlerKnopf = new JButton("Drueck mich fuer +1");
//Knoepfe werden dem ActionListener zugeordnet
zaehlerKnopf.addActionListener(this);
//benoetigt als Eingabeparameter ein Objekt mit dem Interface ActionListener
knopfZumBeenden.addActionListener(this);
//benoetigt als Eingabeparameter ein Objekt mit dem Interface ActionListener
//Knoepfe werden dem JPanel hinzugefügt
panel.add(knopfZumBeenden);
panel.add(zaehlerKnopf);
// Label wird dem Panel hinzugefügt
panel.add(label);
// Panel wird dem Objekt (das als Sub-Klasse vom JFrame
//automatisch ein Frame ist) hinzugefügt
this.add(panel);
this.setVisible(true);
}
// Methode
// Mit dem ActionListener Interface muss die Methode actionPerformed
//implementiert werden!
// Wird einer der Knoepfe gedrueckt, wird ein ActionEvent-Objekt erstellt:
// knopfBetaetigung
// Die Referenz auf das Objekt wird als Parameter uebergeben
public void actionPerformed (ActionEvent knopfBetaetigung){
// Ist das erstellte Objekt knopfBetaetigung der zaehlerKnopf,
//soll die gezaehlte Zahl um 1 erhoeht werden
//Dann soll der Label-Text die gezaehlte Zahl ausgeben
if (knopfBetaetigung.getSource() == this.zaehlerKnopf) {
for (int i = 1; i <= 3; i++ ){
gezaehlteZahl = i;
label.setText("Zaehlerstand: " + String.valueOf(gezaehlteZahl));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Ist das erstellte Objekt knopfBetaetigung der knopfZumBeenden,
// soll das Fenster geschlossen werden
else if (knopfBetaetigung.getSource() == this.knopfZumBeenden) {
System.exit(0);
}
}
}[/CODE]