setText bei JLabel

MonsterBit

Mitglied
Moin,

also mein Problem ist folgendes:

Ich brauche für mein Programm ein Countdown der auf einer GUI angezeigt wird.
Dafür habe ich eine Klasse CountdownLabel, die die Klasse JLabel erweitert. CountdownLabel hat eine Methode
Code:
start(final int stunden)
die ich von einer anderen Klasse aufrufen möchte. Soweit so gut...

In der Methode
Code:
start()
wird ein neuer Thread gestartet der die Sekunden runterzählt und dann über
Code:
setText(time)
die Zeit aktualisiert.

Wenn ich jetzt von der anderen Klasse den Countdown starte, wird zwar der Thread ausgeführt aber es wird nicht die Zeit auf dem Label aktuallisiert. Das erkenne ich daran, das ich nebenbei mir die aktuelle Zeit mit
Code:
System.out.println(time);
ausgebe.

Und jetzt kommt das interessante:
Wenn ich jedoch
Code:
start();
im Konstruktor meiner CountdownLabel-Klasse aufrufe, funktionierts einfandfrei...???:L

Das ganze sieht ungefähr so aus:
Java:
public class CountdownLabel extends JLabel {
         public CountdownLabel() {
         //....
         start(6);  //<--- Im Konstruktor funktioniert es
         }

         public void start(final int stunden) {
              new Thread() {
                public void run() {
                   //... 
                   
                   setText(time);

              }
         }
         
}

Hab ich jedoch meine andere Klasse, womit ich auch den Countdown starten will, gehts nicht:
Java:
public class Main {
         //...
         CountdownLabel cl = new CountdownLabel();
         cl.start(6);  
}

Kann mir einer sagen, wieso setText(); nur funktioniert wenn ich start(); im Konstruktor der eigenen Klasse aufrufe und warum nicht, wenn ich den Countdown von einer anderen Klasse aus starten will?

MonsterBit
 

Volvagia

Top Contributor
Ließ dir mal Infos zu Multithreading und Swing durch. Und warum man keinen Thread im Konstruktor einer nicht-finalisierten Klasse starten sollte. Und warum man "start()" von einen neuen Thread aufrufen kann.
 
S

SlaterB

Gast
> Und warum man keinen Thread im Konstruktor einer nicht-finalisierten Klasse starten sollte.

das wäre mir persönlich auch neu,
unspezifisch irgendwas zu lesen scheint mir nicht zielführend, gibts genauere Infos/ Links?

ich vermute einen einfachen Grund:
die Main-Klasse erzeugt ein zweites Label-Objekt, dort läuft der Thread 1A, setText() usw. wird aufgerufen,
nur interessiert das niemanden, das erste Label welches in der GUI sichtbar ist bleibt unverändert

bei Konstruktor-Aufruf läufts vielleicht in beiden Labels
> Das erkenne ich daran, das ich nebenbei mir die aktuelle Zeit mit System.out.println(time); ausgebe.
hmm, zwei Ausgaben wären doch auffällig, na möglich bleibt es noch je nach Umständen
 
Zuletzt bearbeitet von einem Moderator:

Ariol

Top Contributor
Da fehlt ein
Code:
.run()
-Aufruf auf das Thread-Object.
Zumindest in deinem Beispiel...
So kann nie was passieren.
 

Volvagia

Top Contributor
Von FindBugs:

Code:
Constructor invokes Thread.start()
The constructor starts a thread. This is likely to be wrong if the class is ever extended/subclassed, since the thread will be started before the subclass constructor is started.
 

MonsterBit

Mitglied
Ok, nochmal zur Klärung.

Der Thread startet. Im Beispiel habe ich ein .start(); hinter der Klammer vergessen. Ausedem weis ich das der Thread startet, weil der Countdown ja in der Console angezeigt wird. D.h. ich hab setText(time), und darunter System.out.println(time) nur um zu gucken ob überhaupt was passiert. Aber wie gesagt, in der Konsole läuft der Countdown.

Wenn 2 Labelobjekte erzeugt werden, was kann ich dann tun?
Ich versteh nicht, wo der unterschied ist, ob ich start() in einer anderen Klasse aufrufe oder im Konstruktor der eigenen Klasse. Ich ändere ja nichts an der Methode start()...

@Volvagia: Das verstehe ich nicht ganz.... Ich will ja auch nicht, das der Konstruktor den Thread in start() startet. Aber nur so funktioniert es... rufe ich start() von einer anderen Klasse auf, gehts nicht. Oder vielleicht versteh ich nicht ganz was du meinst...
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Wenn 2 Labelobjekte erzeugt werden, was kann ich dann tun?
Ich versteh nicht, wo der unterschied ist, ob ich start() in einer anderen Klasse aufrufe oder im Konstruktor der eigenen Klasse. Ich ändere ja nichts an der Methode start()...

Wärst nicht der erste, der ausversehen ein zweites Objekt erzeugt und an diesem Methoden aufruft und sich wundert, das sich am anderen Objekt nichts tut.

Entscheidend ist, dass Du start() an dem Label aufrufst, das auch tatsächlich in Deiner GUI verbaut ist.
Mehr kann man da ohne Code nicht dazu sagen.
 

MonsterBit

Mitglied
Ok, dann komm hier der Code:
Java:
public class CountdownLabel extends JLabel{

    private String stunde, minute, sekunde;    

    public CountdownLabel() {

        stunde  = "00:";
        minute  = "00:";
        sekunde = "00";   

        try {
            //Schriftart laden
            InputStream fin = this.getClass().getResourceAsStream("digital-7.ttf");
            Font font = Font.createFont (Font.PLAIN, fin).deriveFont(48f);

            setFont(font);
            setForeground(Color.gray);
            setPreferredSize(new Dimension(150, 45));
            } catch(FontFormatException ex) {

            } catch(IOException ex) {

            }

       setText(stunde+minute+sekunde);
       //start(6); So würde es gehen...       
    }  

     public void start(final int stunde) {

        new Thread() {
            public void run() {

                System.out.println("blöa");

                //Anzahl der Stunden in Sekunden umrechnen
                int stunden = stunde;
                int minuten = 60;
                int sekunden = 60;

                //Anfangsanzeige
                String dStunde = stunden+":";
                String dMinute = "00:";
                String dSekunde = "00";               
                System.out.println("blöa");

                try {
                    sleep(1000);

                    //Überall eins abziehen, da schonm eine sekunde vergangen ist
                    stunden--;
                    minuten--;
                    sekunden--;

                    while(true) {
                        //Sekunde warten
                        sleep(1000);

                        if(sekunden > 0) {
                            sekunden--;

                            dStunde = stunden+":";
                            dMinute = minuten+":";
                            dSekunde = sekunden+"";

                            setText(dStunde+dMinute+dSekunde);
                            System.out.println(dStunde+dMinute+dSekunde);

                        } else {
                            minuten--;
                            sekunden = 59;
                            System.out.println(dStunde+dMinute+dSekunde);
                        }

                        if(minuten < 0) {
                            stunden--;
                            minuten = 59;
                            sekunden = 59;
                            System.out.println(dStunde+dMinute+dSekunde);
                        }

                        if(stunden < 0) {
                            setText("Fertig");
                            break;
                        }
                    }

                } catch (InterruptedException ex) {
                    Logger.getLogger(JukeBox.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        }.start();
    }
}

EDIT: Ich hab den Fehler jetzt gefunden... war ein ganz dummer. Ich hatte wohl 2 CountdownLabel. einmal cl1 und cl2. ich wollte, dass cl1 startet hab aber cl2.start(6); geschrieben....:oops:
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Meinte eigentlich den Code in dem das CountdownLabel verwendet wird ;-)

laut Deiner wird der Thread ja gestartet - daher sollte dieser funktioneren.
 

Ariol

Top Contributor
Works for me:
Java:
  CountdownLabel l = new CountdownLabel();
  l.start(2);
  jPanel2.add(l, gbc);

Alternativ:
Java:
  CountdownLabel l = new CountdownLabel();
  l.start(2);
  jPanel2.add(l, gbc);

Angepasste Stellen:
[JAVA=16]
public CountdownLabel() {

stunde = "00:";
minute = "00:";
sekunde = "00";

// try {
// //Schriftart laden
// InputStream fin = this.getClass().getResourceAsStream("digital-7.ttf");
// Font font = Font.createFont (Font.PLAIN, fin).deriveFont(48f);
//
// setFont(font);
setForeground(Color.gray);
setPreferredSize(new Dimension(150, 45));
// } catch(FontFormatException ex) {
//
// } catch(IOException ex) {
//
// }

setText(stunde+minute+sekunde);
}
[/code]

[JAVA=98]
} catch (InterruptedException ex) {
//Logger.getLogger(JukeBox.class.getName()).log(Level.SEVERE, null, ex);
ex.printStackTrace();
}
[/code]
 
S

SlaterB

Gast
bisschen redundant inzwischen, aber da schon getippt:

@MonsterBit
der Code sagt nichts darüber aus,
- wer alles CountdownLabel-Objekte erzeugt (ob 1 oder mehrere kannst du gut mit einer Ausgabe im Konstruktor prüfen)
- welche(s) davon wenn überhaupt in die GUI eingefügt wird, da allein könne 375 Dinge schief gehen
- wer wann an welchen dieser Objekte start() aufruft
usw.
also die Aufrufer bzw. der Restcode sind genauso wichtig

edit:
@Ariol

Works for me: + Alternativ: sind gleich? ;)
 

MonsterBit

Mitglied
Danker, war aber ein anderer Fehler
... war ein ganz dummer. Ich hatte wohl 2 CountdownLabel. einmal cl1 und cl2. ich wollte, dass cl1 startet hab aber cl2.start(6); geschrieben....:oops:
 

Michael...

Top Contributor
Sagte ja ;-)
Wärst nicht der erste, ...

Da Du den Threadcode gepostest hast, hier noch eine kleine Anregung:
Java:
	new Thread(new Runnable() {
		public void run() {
			long time = stunde*3600;
			while(time>=0) {
				String timeString = String.format("%02d:%02d:%02d", time/3600, time/60%60, time%60);
				System.out.println(timeString);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				time--;
			}
			System.out.println("Countdown beemdet!");
		}
	}).start();
 

MonsterBit

Mitglied
Vielen Dank!

Ich hab mir schon die ganze Zeit über gedacht, das meine Lösung für einen Countdown etwas sehr "improvisiert" war. Deiner hingegen ist viel besser:)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R JLabel.setText("") und überzeichnen Problem :-((( Java Basics - Anfänger-Themen 6
L Methode in setText() setzen Java Basics - Anfänger-Themen 6
S setText aus anderer class heraus Java Basics - Anfänger-Themen 6
P Settext-Methode funktioniert nicht Java Basics - Anfänger-Themen 11
D SetText als Array ausgeben Java Basics - Anfänger-Themen 1
D SetText Ausgabe von einem Array Java Basics - Anfänger-Themen 6
P JavaFX TextArea.setText Java Basics - Anfänger-Themen 13
L Null Pointer Exception bei setText Java Basics - Anfänger-Themen 9
G JTextField, DocumentListener, Fehler bei setText() Java Basics - Anfänger-Themen 3
T Input/Output Alternativen zu setText Java Basics - Anfänger-Themen 3
S JTextField leeren ohne setText("")? Java Basics - Anfänger-Themen 3
J "label.setText" funktioniert nicht Java Basics - Anfänger-Themen 9
K JButton.setText Problem Java Basics - Anfänger-Themen 6
T JTextPane - setText kein kein neuladen der Bilder? Java Basics - Anfänger-Themen 8
O Layoutpositionierung nach setText Java Basics - Anfänger-Themen 2
D TextArea clearen mit setText("") ? Java Basics - Anfänger-Themen 21
Screen getText , setText Fehler ! Swing Java Basics - Anfänger-Themen 11
K Warum funktioniert hier die setText methode? Java Basics - Anfänger-Themen 3
M Konflikt bei setPage -> setText -> setPage in JTextPan Java Basics - Anfänger-Themen 2
G setText() Java Basics - Anfänger-Themen 8
S Thread.sleep i.V.m Button.setText() Java Basics - Anfänger-Themen 8
B ItemListener - setText Befehl geht nicht Java Basics - Anfänger-Themen 3
E Probleme mit setText() bzw. append() bei TextArea Java Basics - Anfänger-Themen 13
G Problem mit JTextField.setText(); Syntax Java Basics - Anfänger-Themen 3
S setText funzt nicht - warum? Java Basics - Anfänger-Themen 14
S JTextField.setText("hallo") wirft exception. Java Basics - Anfänger-Themen 3
R Wie könnte es aussehen? (MainClass.tfLog.setText(...) ) Java Basics - Anfänger-Themen 4
M Textfield.SetText?Textfield.addText? Java Basics - Anfänger-Themen 6
M Problem mit setText() und lesen von .doc- und .pdf-Dateien Java Basics - Anfänger-Themen 6
J setText mit Netbeans Java Basics - Anfänger-Themen 6
J Auf einem JLabel Linien Malen Java Basics - Anfänger-Themen 1
J neues Object (JLabel) vorab zum Layout hinzufügen , Location setzen, etc? Java Basics - Anfänger-Themen 2
J JLabel bzw. Image Icon mit KeyEvent bewgen Java Basics - Anfänger-Themen 9
GoenntHack Java Text von JLabel verändert sich nicht Java Basics - Anfänger-Themen 1
JUNSKI Zeilenumbruch JLabel Java Basics - Anfänger-Themen 1
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
S Mit for-Schleife ein 2D JLabel-Array mit veränderbaren Icons erstellen Java Basics - Anfänger-Themen 3
Tom/S JLabel Icon Farbe Java Basics - Anfänger-Themen 2
N Variabel in eine class mit "extends JLabel" übertragen Java Basics - Anfänger-Themen 2
S Kontrollieren, ob ein Jlabel nicht sichtbar ist Java Basics - Anfänger-Themen 6
S Input/Output JLabel verschieben Java Basics - Anfänger-Themen 7
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
CptK Interface JLabel bewegt sich nicht sondern teleportiert sich... Java Basics - Anfänger-Themen 3
CptK Methoden JLabel erstellen & verschieben Java Basics - Anfänger-Themen 1
T JLabel hat falsche größe Java Basics - Anfänger-Themen 1
A JLabel mit button drücken verändern Java Basics - Anfänger-Themen 6
CptK JLabel im Array Java Basics - Anfänger-Themen 2
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
D Methoden JButton und JLabel in einer Methode erstellen Java Basics - Anfänger-Themen 5
P Auf JLabel zugreifen Java Basics - Anfänger-Themen 12
P Erste Schritte JLabel wird nicht angezeigt Java Basics - Anfänger-Themen 4
W JLabel, Farbe durch Listener ändern Java Basics - Anfänger-Themen 6
M Vererbung Ein JLabel einer Elternklasse anzeigen Java Basics - Anfänger-Themen 8
D Klassen Wert aus JTextfield in JLabel (andere Klasse) darstellen. Java Basics - Anfänger-Themen 60
J Array in JLabel ausgeben Java Basics - Anfänger-Themen 2
S Variablen JLabel backImagePanel Fehlermeldung Java Basics - Anfänger-Themen 3
snipesss [Java] Schriftart und Schriftgröße von JLabel in einer Zeile festlegen? Java Basics - Anfänger-Themen 3
J JLabel cannot be resolved Java Basics - Anfänger-Themen 8
S JLabel sichtbar machen/GUI Java Basics - Anfänger-Themen 3
WetWer Animation JLabel Java Basics - Anfänger-Themen 2
W aus Methode auf JLabel zugreifen und Image verändern Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
L Variable für JLabel wird nicht erzeugt Java Basics - Anfänger-Themen 6
T Jlabel durch Text in 2 anderen Jlabels sichtbar machen Java Basics - Anfänger-Themen 4
T Objekt in ein JLabel der GUI übergeben Java Basics - Anfänger-Themen 3
S JLabel an Methode übergeben Java Basics - Anfänger-Themen 2
D Ausgabe über JLabel Java Basics - Anfänger-Themen 12
M Erste Schritte Wie speichert und gibt man Arrays aus? (JLabel) Java Basics - Anfänger-Themen 12
M Fangspiel-Probleme (JLabel, Objekt zurücksetzen) Java Basics - Anfänger-Themen 3
C Rechenaufgabe im JLabel ausrechnen Java Basics - Anfänger-Themen 2
J JLabel Icon neu zeichnen Java Basics - Anfänger-Themen 2
Z JLabel Icon ändern Java Basics - Anfänger-Themen 2
Z Vector in jTextField/jLabel darstellen Java Basics - Anfänger-Themen 4
D JLabel ändern in actionperformed Java Basics - Anfänger-Themen 2
V jab ich eclipse verrückt gemacht :D ? array Jpanel, Jlabel Grafik Fehler / Frage Java Basics - Anfänger-Themen 5
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
G drawString/ JLabel updaten Java Basics - Anfänger-Themen 1
G mouseDragged auf Jlabel Java Basics - Anfänger-Themen 2
K JLabel zur Laufzeit dynamisch erzeugen Java Basics - Anfänger-Themen 7
M Frage zu JLabel Java Basics - Anfänger-Themen 5
T JLabel-Bilderpfad ändern... Java Basics - Anfänger-Themen 2
T JLabel anzeigen lassen... Java Basics - Anfänger-Themen 6
T Mein String in ein JLabel stecken Java Basics - Anfänger-Themen 2
Sogomn JLabel in anderer Klasse zum JFrame hinzufügen Java Basics - Anfänger-Themen 2
T JLabel zum klicken... Java Basics - Anfänger-Themen 15
W Datentypen String-Ausgabe in jLabel Java Basics - Anfänger-Themen 14
J JLabel Ausgabe Java Basics - Anfänger-Themen 3
B mouseClicked JLabel Array mitteilen Java Basics - Anfänger-Themen 6
L JLabel Icon Größe anpassen Java Basics - Anfänger-Themen 11
A Zeilenumbruch im Jlabel Java Basics - Anfänger-Themen 11
3 JLabel - Text in mehreren Zeilen zentrieren Java Basics - Anfänger-Themen 5
R JLabel imageicon jede Sekunde wechseln Java Basics - Anfänger-Themen 3
G GUI JLabel ersetzen Java Basics - Anfänger-Themen 3
M Zeilenumbruch in JLabel Java Basics - Anfänger-Themen 51
A Bildgröße automatisch auf JLabel Größe konvertieren Java Basics - Anfänger-Themen 9
S Text in einem JLabel nur zum Teil Fett Java Basics - Anfänger-Themen 2
B JLabel Text Formatierung Java Basics - Anfänger-Themen 5
J Bild auf JLabel wird nicht angezeigt Java Basics - Anfänger-Themen 11
S NullPointerException bei zweidimensionalem JLabel-Array Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben