JButton Text 2 Mal ändern funktioniert nicht

C

Carcharoth

Mitglied
Guten Tag

Ich will exemplarisch den Text eines JButtons 2 Mal nacheinander ändern (mit einer kleinen Pause dazwischen). Solange ich dies ausserhalb des ActionListeners mache, funktioniert es perfekt. Wenn ich den Code in den ActionListener / actionPerformed einbaue, zeigt er mir die erste Textänderung nicht mehr an (es sieht so aus, als würde er nur die Pause und die zweite Textänderung machen).

Ich habe das Gefühl es hängt entweder mit dem Repaint-Aufruf oder mit der Sichtbarkeit des Buttons innerhalb von actionPerformed zusammen. Aber ich komme nicht darauf.

Danke für eure Hilfe.
Gruss

Java:
public class Fenster extends JFrame {
    
    private JPanel contentPane;
    
    public Fenster() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);
        
        JButton meinButton = new JButton("New button");
        contentPane.add(meinButton);
        
        setVisible(true);
        
        meinButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getSource()==meinButton) {
                    meinButton.setText("aaaa");
                    meinButton.repaint();
                    
                    try {
                        TimeUnit.MILLISECONDS.sleep(1000);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                    
                    meinButton.setText("bbbb");
                    meinButton.repaint();
                }
            }
        });
    }
}
 
B

BestGoalkeeper

Bekanntes Mitglied
Du blockierst mit dem ActionListener den Event Dispatch Thread. Veränderungen der UI müssen im Event Dispatch Thread stattfinden, das "Warten" muss in einem eigenen Thread stattfinden. Du musst innerhalb des ActionListener innerhalb eines Threads "warten" und innerhalb des Event Dispatch Thread die UI ändern:
Java:
import java.awt.event.*;
import java.util.concurrent.TimeUnit;

import javax.swing.*;

public class Fenster extends JFrame {
    private JPanel contentPane;

    public Fenster() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);

        JButton meinButton = new JButton("New button");
        contentPane.add(meinButton);

        setVisible(true);

        meinButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == meinButton) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            SwingUtilities.invokeLater(new Runnable() {
                                @Override
                                public void run() {
                                    meinButton.setText("aaaa");
                                    meinButton.repaint();
                                    meinButton.setEnabled(false);
                                }
                            });
                            try {
                                TimeUnit.MILLISECONDS.sleep(2500);
                            } catch (InterruptedException e1) {
                                e1.printStackTrace();
                            }
                            SwingUtilities.invokeLater(new Runnable() {
                                @Override
                                public void run() {
                                    meinButton.setText("bbbb");
                                    meinButton.repaint();
                                    meinButton.setEnabled(true);
                                }
                            });
                        }
                    }).start();
                }
            }
        });
    }

    public static void main(String[] args) {
        new Fenster();
    }
}
 
C

Carcharoth

Mitglied
Hallo BestGoalKeeper

Vielen Dank für deine Hilfe. Es funktioniert einwandfrei.

Die Syntax ist für mich noch etwas schwer nachzuvollziehen aber ich will zuerst sicherstellen, dass ich den Gesamtmechanismus verstanden habe.

Verstehe ich das also richtig, dass das Warten (Sleep) im Thread des ActionListeners (hier new Thread) läuft während die beiden invokelater-Blocks erlauben das Update der UI im Event Dispatch Thread auszuführen?

Gruss
 
mihe7

mihe7

Top Contributor
Verstehe ich das also richtig, dass das Warten (Sleep) im Thread des ActionListeners (hier new Thread) läuft während die beiden invokelater-Blocks erlauben das Update der UI im Event Dispatch Thread auszuführen?
Ja. Der EDT arbeitet eine Warteschlange (Event Queue) ab, in der zu verarbeitende Ereignisse oder auch Runnables liegen. Mit invokeLater wird ein Runnable in diese Warteschlange eingereiht.
 
B

BestGoalkeeper

Bekanntes Mitglied
Mit einer Grafik ist das einfacher zu erklären, Du blockierst mit dem ActionListener den EDT, der auch für die Aktualisierung der UI zuständig ist:

bi1.png
 
C

Carcharoth

Mitglied
Ja die Graphik hilft wirklich um es zu verstehen. Danke.

Für meinen konkreten Fall habe ich die Struktur mit den Invokelater in eine For Schleife eingebaut.
Wie kann ich den Zähler t in die Methode run() innerhalb des invokelaters übergeben?

Java:
public class Fenster extends JFrame {
    
    private JPanel contentPane;
    
    public Fenster() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);
        
        JButton meinButton = new JButton("New button");
        contentPane.add(meinButton);
        
        setVisible(true);
        
        meinButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == meinButton) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int t=5;t>=0;t--) {
                                SwingUtilities.invokeLater(new Runnable() {
                                    @Override
                                    public void run() {
                                        meinButton.setText("t=" + t);
                                        meinButton.repaint();
                                    }
                                });
    
                                try {
                                    TimeUnit.MILLISECONDS.sleep(1000);
                                } catch (InterruptedException e1) {
                                    e1.printStackTrace();
                                }
                            }
                        }
                    }).start();
                }
            }
        });
    }
}
 
mihe7

mihe7

Top Contributor
Wie kann ich den Zähler t in die Methode run() innerhalb des invokelaters übergeben?
Indem Du eine lokale Variable final deklarierst:
Java:
                           for (int t=5;t>=0;t--) {
                                final int value = t;
                                SwingUtilities.invokeLater(new Runnable() {
                                    @Override
                                    public void run() {
                                        meinButton.setText("t=" + value);
                                        meinButton.repaint();
                                    }
                                });
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T JButton Text ändern Java Basics - Anfänger-Themen 4
M Text auf JButton ändern Java Basics - Anfänger-Themen 5
A jbutton - icon linksbündig, text zentriert Java Basics - Anfänger-Themen 10
E JButton-Text wird in Schleife nicht geändert Java Basics - Anfänger-Themen 4
D HTML Text von jButton disablen Java Basics - Anfänger-Themen 2
G JButton text passt nicht Java Basics - Anfänger-Themen 2
H Frage zu JButton Text Java Basics - Anfänger-Themen 4
E JButton und JTextField Java Basics - Anfänger-Themen 1
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
J Erste Schritte if Abfrage von JButton in 2. Klasse Java Basics - Anfänger-Themen 27
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
krgewb Icon von JButton ändern Java Basics - Anfänger-Themen 1
P JButton -Arrays Java Basics - Anfänger-Themen 4
A JButton in anderer Klasse bearbeiten. Java Basics - Anfänger-Themen 2
L Erste Schritte JButton reagiert nicht Java Basics - Anfänger-Themen 5
S Bild über JButton legen Java Basics - Anfänger-Themen 3
V Einem JButton anweisungen geben Java Basics - Anfänger-Themen 4
D Methoden JButton und JLabel in einer Methode erstellen Java Basics - Anfänger-Themen 5
F Interface JButton von anderer Klasse hinzufügen Java Basics - Anfänger-Themen 2
J JButton macht was er will Java Basics - Anfänger-Themen 3
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
H JButton - Wechsel der Textfarbe alle 500ms Java Basics - Anfänger-Themen 10
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
N JButton anpassen Java Basics - Anfänger-Themen 3
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
D JButton in JDialog mit Action belgen Java Basics - Anfänger-Themen 6
V JButton einer anderen Klasse übergeben? Java Basics - Anfänger-Themen 6
F JButton [] mit Werten hinterlegen Java Basics - Anfänger-Themen 10
M Code um per jButton ein neues Fenster zu öffnen Java Basics - Anfänger-Themen 3
A weiter JButton Fehler Java Basics - Anfänger-Themen 3
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
S JCombobox und JButton verknüpfen Java Basics - Anfänger-Themen 6
V wie kann ich eine Schleife pausieren, bis ein Jbutton gedrückt wird ? Java Basics - Anfänger-Themen 17
N Erste Schritte JButton reagiert nur einmal. Java Basics - Anfänger-Themen 12
S JButton Java Basics - Anfänger-Themen 2
A Farben wechseln mit JButton Java Basics - Anfänger-Themen 2
S Farbe eine Zeile in JTable ändern, wenn JButton geklickt wurd Java Basics - Anfänger-Themen 4
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
A Labels Inner JButton Event Erstellbar? Java Basics - Anfänger-Themen 3
K JButton alles zurücksetzen Java Basics - Anfänger-Themen 1
U JButton: Beschriftung ueber Variable zuweisen Java Basics - Anfänger-Themen 6
S JButton erscheint erst bei Mouseover Java Basics - Anfänger-Themen 10
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S JDK installieren JButton BorderPoints?! Java Basics - Anfänger-Themen 7
E Problem mit erben von JButton Java Basics - Anfänger-Themen 7
J Bei Hinzufügen von JButton Programm langsam Java Basics - Anfänger-Themen 3
J Verknüpfung von JButton to JTextField Java Basics - Anfänger-Themen 4
S Jbutton per Passworteingabe aktivieren Java Basics - Anfänger-Themen 2
G über JButton Action einen anderen Button verändern Java Basics - Anfänger-Themen 7
H JButton - Icon(.png) aus resources laden Java Basics - Anfänger-Themen 23
M Hintergrundbild für JButton Java Basics - Anfänger-Themen 6
M Input/Output JFrame mit JButton und JTextfield Java Basics - Anfänger-Themen 114
J Hilfe bei JButton Java Basics - Anfänger-Themen 6
A JButton[] und String[] in doppelter For-Schleife Java Basics - Anfänger-Themen 4
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
pg1337 JButton zuschneiden Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
D JButton Array setBackground Java Basics - Anfänger-Themen 2
F JButton wie selektierter JTabbebPane-Header Java Basics - Anfänger-Themen 7
G jButton bei Klick String +1 Java Basics - Anfänger-Themen 5
C OOP Java JButton mit Funktion belegen Java Basics - Anfänger-Themen 3
S JButton wird nicht angezeigt Java Basics - Anfänger-Themen 14
C JButton.getIcon() != null Java Basics - Anfänger-Themen 3
F welches Layout für JButton-Liste verwenden Java Basics - Anfänger-Themen 6
L JButton erscheint nur mit pack() Java Basics - Anfänger-Themen 3
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
E JButton Hintergrund / Rahmen entfernen? Java Basics - Anfänger-Themen 4
L Bild auf einem JButton Java Basics - Anfänger-Themen 4
K JButton.setText Problem Java Basics - Anfänger-Themen 6
M JButton und DisabledIcon Java Basics - Anfänger-Themen 2
K jButton zur Laufzeit hinzufügen Java Basics - Anfänger-Themen 22
A GUI - JButton problem! Java Basics - Anfänger-Themen 5
M JButton selbst nachprogrammieren Java Basics - Anfänger-Themen 3
A JButton Textrahmen Java Basics - Anfänger-Themen 7
A Platzierung eines JButton Java Basics - Anfänger-Themen 4
D JButton oder ImageIcon klickt "langsam" Java Basics - Anfänger-Themen 5
E JButton klassenübergreifend nutzen? Java Basics - Anfänger-Themen 6
R Liste graphischer Objekte z.B. JButton dynamisch erstellen Java Basics - Anfänger-Themen 13
J JList Inhalt nach JButton Klick aktualisieren Java Basics - Anfänger-Themen 8
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
P JButton identifizieren Java Basics - Anfänger-Themen 8
K Funktion zu einem JButton hinzufügen Java Basics - Anfänger-Themen 27
E Auf JButton in Arraylist zugreifen Java Basics - Anfänger-Themen 6
E Andere Form eines JButton Java Basics - Anfänger-Themen 17
A JButton ActionListener nach einmaligem Ausführen zurücksetzen Java Basics - Anfänger-Themen 13
B JButton Größe einstellen? Java Basics - Anfänger-Themen 3
E Zeilenumbruch in JButton mit Variable Java Basics - Anfänger-Themen 2
A JButton erscheint nicht (BlueJ) Java Basics - Anfänger-Themen 2
M JButton sieht komisch aus :-) Java Basics - Anfänger-Themen 5
B JPanel über JButton umändern Java Basics - Anfänger-Themen 9
D JButton transparent bekommen? Java Basics - Anfänger-Themen 5
H JButton Unsichtbar Java Basics - Anfänger-Themen 7
R JTextField mittels JButton in Konsole ausgeben Java Basics - Anfänger-Themen 2
J Variable die bei JButton Clicks mitzählt Java Basics - Anfänger-Themen 9
Developer_X JButton removt sich selbst Java Basics - Anfänger-Themen 32
K JButton blaue Umrandung deaktivieren Java Basics - Anfänger-Themen 9
S Nullpointererror bei JButton-Feld Java Basics - Anfänger-Themen 2
I JButton zum frame schließen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Anzeige

Neue Themen


Oben