Aktualisierung von jLabel in jFrames

PetBe

Mitglied
Hi Leute,

ich würde gerne ein von eiem jLabel in einem jFrame angezeigtes Bild (ImageIcon) verändern, wenn ein Button gedrückt wurde. Dazu habe ich folgende Klasse:
Code:
    class StartButtonListener implements ActionListener{
       public void actionPerformed (ActionEvent ae) {
           int i=0;
           while (i<5) {
               pictureLabel1.setIcon(icon1);
              
              
              System.out.println("i" + i);
               
               try{
                   Thread.sleep(1200);
               }
               
               catch (Exception ex) {
                   
               }
               
               pictureLabel1.setIcon(icon2);
           
               i++;
           }//
           
       }
       
   }

Beim Ablauf ist es so, dass sich das Bild nur einmal ändert und zwar nach dem letzten Durchlauf von i. Ich würde gerne, dass sich das Bild bei jedem Durlauf von i ändert. Ich habe es mit "pictureLabel1.repaint()" und "c.repaint()" (C ist der Container) probiert. Das zeigt aber keinerlei Wirkung. Wie bekomme ich das jLabel aktualisiert?
 

Robat

Top Contributor
Du rufst Thread.sleep(int ms) auf dem EDT auf. Das legt deine GUI schlafen und wird damit auch nicht aktualisiert.

Nutz lieber (bspw.) einen javax.swing.Timer
Hier mal eine kleine SSCCE anhand eines einfachen Farbwechsels (funktioniert mit Bildern genauso):

Java:
ActionListener blinkListener = new ActionListener(){
    int count = 0;
    @Override
    public void actionPerformed(ActionEvent e){
        label.setForeground(count % 2 == 0 ? Color.RED : Color.BLUE);

        if(++count > 5)
            ((Timer)e.getSource()).stop();

    }
};

btn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e){
        new Timer(600, blinkListener).start();
    }
});
 

PetBe

Mitglied
Ich habe jetzt eine separate Thread Klasse erstellt, die folgendermaßen aussieht:
Code:
package game;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class JLabelChangerThread extends Thread{
   
    JLabel label;
    ImageIcon icon1 = new ImageIcon(("src/game/pictures/Bild 1.PNG"));
    ImageIcon icon2 = new ImageIcon(("src/game/pictures/Bild 2.PNG"));
    ImageIcon icon3 = new ImageIcon(("src/game/pictures/Bild 3.PNG"));
   
    public JLabelChangerThread (String name, JLabel label) {
        super(name);
        this.label=label;
       
    }

   
    public void run() {
        for (int i =0; i<5; i++) {
            label.setIcon(icon1);
           
            try {
               
                this.sleep(200);
           
            }
           
            catch (Exception ex) {
               
            }
            label.setIcon(icon2);
           
            try {
               
                this.sleep(200);
               
                }
               
                catch (Exception ex) {
                   
                }
           
           
           
            label.setIcon(icon3);
           
            }
    }
   
}

In meiner Hauptklasse rufe ich den Thread mittels einer ActionListener Klasse auf:
Code:
class StartButtonListener implements ActionListener{
        public void actionPerformed (ActionEvent ae) {
            JLabelChangerThread thread1 = new JLabelChangerThread ("jLabel_1" , pictureLabel1);
            thread1.run();
           
        }
       
    }

Leider ändert sich am Verhalten nichts. Ich sage doch jetzt hier expliziet, dass dieser Thread (this.sleep(200)) unterbrochen werden soll; nicht der Thread für die GUI.
 

Robat

Top Contributor
Ich sage doch jetzt hier expliziet, dass dieser Thread (this.sleep(200)) unterbrochen werden soll; nicht der Thread für die GUI.
Nein. Wenn du dir die Java-Doc anschaust wirst du sehen, dass die Methode public static void sleep(long millis) den aktuellen Thread schlafen legt. Welches der aktuelle Thread ist kann man so nicht beurteil.

Wie oben schon beschrieben solltest du Animationen o.ä. mit schon existierenden Klassen wie javax.swing.Timer erstellen.
 

Flown

Administrator
Mitarbeiter
Thread startet man mit thread.start() und nicht mit thread.run().
 
Zuletzt bearbeitet:

PetBe

Mitglied
Der Fehler war - wie es Flown gesagt hat - dass ich run() anstatt start() verwendet habe. Mit start() funktioniert alles, so wie es sein sollte :) Vielen Dank dafür.

Das mit der Timer Klasse verstehe ich nicht ganz anhand des Beispiels von Robat. Wofür ist der Timer gedacht bzw. welchen Vorteil bietet er gegenüber meiner (jetzt funktionierenden) Implementierung? Und was macht der Konstruktor:"new Timer(600, blinkListener)". In der Klasse Timer finde ich einen Konstruktor mit (int, ActionListener) nicht (https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html)
 

PetBe

Mitglied
Hi Leute,

ich bins wieder und habe eine Frage. Ich habe folgende Klasse zur ständigen Aktualisierung von 3 jLabel (mit Aktualisierung meine ich, dass das Image auf den JLabel ständig per Zufall geändert wird):
Java:
ackage game;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class JLabelChangerThread extends Thread{
   
    boolean stop;
    int waitingTime;
    JLabel label;
    ImageIcon [] icons = new ImageIcon[6] ;
   
   
    public JLabelChangerThread (String name, JLabel label) {
        super(name);
        this.label=label;
        stop=false;
        waitingTime=800;
       
           icons[0] = new ImageIcon(("src/game/pictures/Bild 1.PNG"));
         icons[1] = new ImageIcon(("src/game/pictures/Bild 2.PNG"));
         icons[2] = new ImageIcon(("src/game/pictures/Bild 3.PNG"));
         icons[3] = new ImageIcon(("src/game/pictures/Bild 4.PNG"));
         icons[4] = new ImageIcon(("src/game/pictures/Bild 5.PNG"));
         icons[5] = new ImageIcon(("src/game/pictures/Bild 6.PNG"));
       
    }

   
    public void run() {
        while(!stop) {
           
            int zufallszahl = (int) (Math.random() * 6 ) ;
            label.setIcon(icons[zufallszahl]);
           
            try {
               
                this.sleep(waitingTime);
           
            }
           
            catch (Exception ex) {
               
            }
           
           
           
            }
    }
   
    public void decreaseWaitingTime() {
        this.waitingTime = waitingTime/2;
    }
   
    public void stopTheThread() {
        this.stop=true;
    }
   
}
Das funktioniert auch soweit ganz gut. Nur ist mir aufgefallen, dass die Aktualisierung manchmal "stockt" d.h. dass bei den jLabels manchmal ein Bild länger angezeigt wird als es sollte (und somit die Aktualisierung langsamer ist). Hat jemand eine Idee, woran das liegen könnte?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
R Thread-Problem (Aktualisierung von JLabel-Komponente) AWT, Swing, JavaFX & SWT 9
M TableView + Datenbank Aktualisierung AWT, Swing, JavaFX & SWT 4
N Aktualisierung des Fensters AWT Java ohne Ruckeln AWT, Swing, JavaFX & SWT 3
O JavaFX Aktualisierung der Scene AWT, Swing, JavaFX & SWT 1
F Textfeld Währungszahlen und automatische Aktualisierung AWT, Swing, JavaFX & SWT 14
J Denkfehler bei Aktualisierung eines GUI AWT, Swing, JavaFX & SWT 4
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
T Tetris - Gui Aktualisierung AWT, Swing, JavaFX & SWT 2
Y JFormattedTextfield - Aktualisierung und Beschränkung AWT, Swing, JavaFX & SWT 4
dzim TableView - keine Aktualisierung geänderter Items AWT, Swing, JavaFX & SWT 5
B Aktualisierung einer JList AWT, Swing, JavaFX & SWT 5
D JTable Aktualisierung nach hinzufügen eines Datensatzes AWT, Swing, JavaFX & SWT 7
B Problem bei der Aktualisierung des Frames AWT, Swing, JavaFX & SWT 6
lumo SWT Resize und aktualisierung der gui AWT, Swing, JavaFX & SWT 6
B GUI Aktualisierung aus/und eventListener AWT, Swing, JavaFX & SWT 3
S Swing Aktualisierung Fensters AWT, Swing, JavaFX & SWT 7
K Modaler Dialog aber trotzdem Aktualisierung des MainFrames AWT, Swing, JavaFX & SWT 6
W Swing Aktualisierung des Bildes AWT, Swing, JavaFX & SWT 4
C JTable-Aktualisierung leidiges Thema AWT, Swing, JavaFX & SWT 18
Plastagen JTextArea CaretPosition Aktualisierung AWT, Swing, JavaFX & SWT 10
C permanente aktualisierung der Koordinaten der Maus auf einem Panel AWT, Swing, JavaFX & SWT 8
U JComboBox: (Vor)auswahl nach Aktualisierung AWT, Swing, JavaFX & SWT 2
kodela Swing Problem mit sofortiger Aktualisierung eine Textfeldes AWT, Swing, JavaFX & SWT 8
J Progressbar aktualisierung nach file übergabe AWT, Swing, JavaFX & SWT 7
T Aktualisierung einer JComboBox -> RepaintProblem! AWT, Swing, JavaFX & SWT 3
H Aktualisierung Gui AWT, Swing, JavaFX & SWT 5
G Bessere Aktualisierung eines Frames AWT, Swing, JavaFX & SWT 5
P Problem bei Aktualisierung eines JPanels AWT, Swing, JavaFX & SWT 2
S Aktualisierung der GUI AWT, Swing, JavaFX & SWT 6
S Aktualisierung in regelmäßigen Abständen AWT, Swing, JavaFX & SWT 2
L Problem mit der aktualisierung von JTree und Text Area AWT, Swing, JavaFX & SWT 22
F Aktualisierung während MOUSE_PRESSED AWT, Swing, JavaFX & SWT 4
M swt - problem mit aktualisierung des tableeditors AWT, Swing, JavaFX & SWT 3
G Aktualisierung der Ausgabe in SWT AWT, Swing, JavaFX & SWT 2
A Aktualisierung eines Bildes innerhalb einer Komponente AWT, Swing, JavaFX & SWT 7
A JTable - Aktualisierung und Spaltenbreite AWT, Swing, JavaFX & SWT 5
D Aktualisierung von GUI AWT, Swing, JavaFX & SWT 11
W JTextArea als Logausgabe und Aktualisierung AWT, Swing, JavaFX & SWT 3
C zu späte aktualisierung/repaint AWT, Swing, JavaFX & SWT 3
X Probleme mit aktualisierung durch Repaint() Methode AWT, Swing, JavaFX & SWT 3
M problem mit textfield-aktualisierung AWT, Swing, JavaFX & SWT 4
G JScrollPane problem mit aktualisierung der daten AWT, Swing, JavaFX & SWT 3
L Aktualisierung bei JTabbedPane AWT, Swing, JavaFX & SWT 3
T Swing bei Realtime-Aktualisierung zu langsam? AWT, Swing, JavaFX & SWT 10
M JCombobox aktualisierung, beim wecheseln des Tab JTabbedPane AWT, Swing, JavaFX & SWT 3
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C Swing Übergabe von String an JLabel AWT, Swing, JavaFX & SWT 9
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
D JLabel übereinanderlegen AWT, Swing, JavaFX & SWT 5
E JLabel kopieren AWT, Swing, JavaFX & SWT 31
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
J Swing JLabel Verknüpfung aktualisieren AWT, Swing, JavaFX & SWT 3
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
E JLabel AWT, Swing, JavaFX & SWT 1
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
L JLabel ist verzerrt/größer als eingestellt AWT, Swing, JavaFX & SWT 15
B Observer Pattern JLabel ändern AWT, Swing, JavaFX & SWT 7
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L Kalendar als JLabel einfügen AWT, Swing, JavaFX & SWT 3
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing JLabel Klickanimation AWT, Swing, JavaFX & SWT 4
A Swing JLabel als Parameter übergeben AWT, Swing, JavaFX & SWT 9
M JLabel ausrichten AWT, Swing, JavaFX & SWT 2
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
T JLabel Textinhalt von Oben anzeigen AWT, Swing, JavaFX & SWT 1
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
Thallius Swing "..." beim JLabel verhindern? AWT, Swing, JavaFX & SWT 3
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
T Event Handling JLabel als eigener Button AWT, Swing, JavaFX & SWT 7
T JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
F Abgeleitetes JLabel AWT, Swing, JavaFX & SWT 16
S jLabel HTML Formatierung AWT, Swing, JavaFX & SWT 2
J Statisches JLabel adden AWT, Swing, JavaFX & SWT 4
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
T JLabel in die Mitte(JLabel.CENTER geht nicht) AWT, Swing, JavaFX & SWT 12
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
K Swing unterschied JTextField und JLabel AWT, Swing, JavaFX & SWT 7
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20

Ähnliche Java Themen

Neue Themen


Oben