Swing Text eines Lables in einer Methode ändern

kevin9r

Aktives Mitglied
Hallo liebes Forum,
ich habe ein Problem, an dem ich bereits zwei Tage hänge und einfach nicht weiter komme...
Ich habe ein paymentPanel, welches von JPanel erbt. Dort ist nur ein JLabel und ein Jbutton drin. Klickt man auf den Button wird eine Methode namens startRead() in paymentPanel ausgeführt, von dort aus wird noch eine zweite Methode ausgeführt. Diese Methode holt sich von einem Server ständig Statusinformationen. Diese Statusinformationen würde ich gerne in dem Label anzeigen. Das Problem ist, dass das nicht funktioniert. Die zweite Methode die aufgerufen wird holt sich die Daten innerhalb einer while(true) Schleife und wenn die gelesenen Bytes passen dann soll er das Label verändern:
Java:
if(dataString.contains(status1){
infoLabel.setText(status1);
}

Bei einer bestimmten Bytefolge, welche auf jeden fall auftritt wird die while Schleife auch verlassen. Das Label wird einfach nicht verändert. Ich habe es auch schon mit updateUI(); versucht aber alles ohne erfolg.

Ich weiß, dass das Problem bei dem Thread liegt, leider weiß ich nicht wie ich das Lösen kann. Ich friere mit der while Schleife die GUI ein, das sehe ich an dem Button den ich drücke, dieser friert ein und die gesamte Oberfläche ist eingefroren. Aber ich habe keine Ahnung wie ich das ändern kann. Ich habe über das Thread Problem gelesen und habe es auch schon über eine Methode versucht :

Java:
    private void changeJLabel( final String text) {
  EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
      infoLabel.setText(text);
    }
  });
}

aber auch das funktioniert nicht. Ich hoffe ihr könnt mir da irgendwie weiter helfen.

Vielen Dank.
 

kevin9r

Aktives Mitglied
In dem von dir geposteten Schnipsel ist von diesem Problem aber nichts zu sehen....
Poste doch in deinem eigenen Interesse ein MCVE hierzu.

Ok ich Versuchs mal..

Der button ruft die Methode auf :

Java:
public void startRead(){
boolean success;
//von hier aus wird eine weitere Methode aufgerufen, die für die eigentlichen Informationen zuständig ist
success = startPayment();
}


Java:
public boolean startPayment(){
// Variablen werden deklariert und zwei Berechnungen werden durchgeführt die hier irrelevant sind
// und dann gehts los:

while (true) {
            try {
                dataString += String.format("%02x", dIn.readByte() & 0xFF);
      
                if(dataString.contains("04ff")){
                laenge = dIn.readByte();
                status = String.format("%02x", dIn.readByte() & 0xFF);
              
                System.out.println("STATUS : " + status);
               
//------DAS FUNKTIONIERT NICHT:
                changeJLabel(mainProg.getCaptions().getString(status) );
                this.updateUI();
//------
                dOut.write(commandSuccess);
                dataString = "";
            }

// ...
}

Java:
    private void changeJLabel( final String text) {
  EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
      info.setText(text);
    }
  });
}

Alle Methoden befinden sich in einer Klasse, welche von JPanel erbt.
 

mihe7

Top Contributor
Da fehlt die Hälfte. Ich darf annehmen, dass die Meldung "STATUS: " auf der Konsole erscheint? Wenn ja, dann zeig mal die Zeile, in der Du info definierst.
 

kevin9r

Aktives Mitglied
Da fehlt die Hälfte. Ich darf annehmen, dass die Meldung "STATUS: " auf der Konsole erscheint? Wenn ja, dann zeig mal die Zeile, in der Du info definierst.

Info ist das Label.

Java:
 public paymentPanel(gui.start mainProg,String ip, int port, String password) {
 this.mainProg = mainProg;
 this.ip = ip;
 this.password = password;
 this.port = port;
initComponents();
}

in initCompontents:
Code:
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
info = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
info.setFont(new java.awt.Font("Lucida Grande", 0, 36)); // NOI18N
        info.setText("jLabel2");
//...
}

Ja Status wird normal in der Konsole gezeigt. Nur das Swingelement info (JLabel) wird nicht verändert.
 

mihe7

Top Contributor
OK, zwei Dinge: mach mal bitte
Java:
  System.out.println("STATUS : " + status);
  System.out.println("STATUS : " + mainProg.getCaptions().getString(status));
Wenn sich daraus nichts zielführendes ergibt, poste bitte die ganze Klasse (wenn sie sehr groß ist, geht auch Upload).
 

kevin9r

Aktives Mitglied
Ausgabe ist dann:
STATUS : 0a
STATUS: Karte

Diese getCaptions().getString() holt sich nur aus einer properties file einen string, abhängig von status. Der Text, die ganze Logik des Programms funktioniert richtig und macht was es soll. Das einzige das nicht funktioniert, ist das setzen des Textes des Labels info in Echtzeit eben an dieser Stelle:

Java:
public boolean startPayment(){
while (true) {
            try {
                dataString += String.format("%02x", dIn.readByte() & 0xFF);
    
                if(dataString.contains("04ff")){
                laenge = dIn.readByte();
                status = String.format("%02x", dIn.readByte() & 0xFF);
            
                System.out.println("STATUS : " + status);
             
//------DAS FUNKTIONIERT NICHT:
                changeJLabel(mainProg.getCaptions().getString(status) );
                this.updateUI();
//------
                dOut.write(commandSuccess);
                dataString = "";
            }

// ...
}

Du hattest oben schon recht, das hat irgendwas mit diesem EDT zutun. Ich habe aber keine Ahnung wie ich das auslesen der Daten in einen separaten Thread tun soll und wie ich dann dementsprechend das Label setzen soll...
Für mich ist das absolut unverständlich, da der Code ja ausgeführt wird bei dem der Text verändert werden soll, das sehe ich beim debuggen, aber der Text wird nicht verändert, die Oberfläche ist eingefroren.
 

mihe7

Top Contributor
Ach, jetzt komm ich erst mit. Die Schleife läuft weiter? Dann ist die Sache klar.

Der Code wird im EDT ausgeführt. Das ist der "UI-Tread", der z. B. für das Zeichnen der Oberfläche, der Verarbeitung von Ereignissen wie Maus-/Tastatureingaben usw. zuständig ist. So lange Du den blockierst, kann die Oberfläche nicht aktualisiert werden.

Ergo: Du musst den Spaß in einen separaten Thread auslagern. Entweder baust Du ihn Dir selber oder Du verwendest den SwingWorker.
 

kevin9r

Aktives Mitglied
Ach, jetzt komm ich erst mit. Die Schleife läuft weiter? Dann ist die Sache klar.

Der Code wird im EDT ausgeführt. Das ist der "UI-Tread", der z. B. für das Zeichnen der Oberfläche, der Verarbeitung von Ereignissen wie Maus-/Tastatureingaben usw. zuständig ist. So lange Du den blockierst, kann die Oberfläche nicht aktualisiert werden.

Ergo: Du musst den Spaß in einen separaten Thread auslagern. Entweder baust Du ihn Dir selber oder Du verwendest den SwingWorker.

Ja genau! Der Status ändert sich ca 4, 5 mal. Und diese 4, 5 mal soll das Label verändert werden. Ok, kannst du mir nur so eine Grundaufstellung geben. Weil ich verstehe eine Sache nicht.. Ich habe mir mal das Video angesehen:

Dort ist das selbe Problem zu sehen! Nur durch den tipp mit dem "SwingWorker" bin ich darauf gekommen.
Erstmal nur zum Verständnis. Kann ich jetzt so wie der im Video eine neue Methode erstellen, dort erstelle ich den SwingWorker, in dem SwingWorker doInBackground erstelle ich meine while Schleife und von dort aus kann ich dann mein Label verändern?

Ich habe das ganze jetzt mal so versucht, aber ich verstehe die Parameter von dem SwingWorker nicht?
 

mihe7

Top Contributor
Im Prinzip wäre der Aufbau etwa so:
Java:
public boolean startPayment(){
    new SwingWorker<Void,String>() {
        @Override
        public void doInBackground() {
            while (true) {
                try {
                    dataString += String.format("%02x", dIn.readByte() & 0xFF);
    
                    if(dataString.contains("04ff")){
                        laenge = dIn.readByte();
                        status = String.format("%02x", dIn.readByte() & 0xFF);
            
                        System.out.println("STATUS : " + status);
                        publish(mainProg.getCaptions().getString(status));
                        dOut.write(commandSuccess);
                        dataString = "";
                    }
                // ...
            }
        }
        @Override
        public void process(List<String> values) {
            info.setText(values.get(0));
        }
    }.execute();
}
Ob das reicht, kann ich Dir allerdings nicht sagen, weil ich nicht weiß, wo Du die ganzen Variablen noch überall verwendest, die in doInBackground genutzt werden. Da musst Du ggf. den Zugriff synchronisieren.

Außerdem wirst Du wahrscheinlich verhindern wollen, dass der Spaß mehrfach ausgeführt wird.
 

kevin9r

Aktives Mitglied
Super, danke, das funktioniert in der Tat, muss jetzt so einiges in meinem Programm umschreiben, da ich mehrmals den Fehler hatte.

Kannst du mir aber bitte noch eine Sache erklären? Irgendwie wird die Funktion einfach mittendrin verlassen und er springt mir in die done Methode. Woran liegt das? Wann verlässt der SwingWorker seine doInBackground() Methode und geht in die done() Methode?

Außerdem sehe ich im Debugger, dass er jedesmal einen neuen Thread startet, der alte aber nicht beendet wird. Wir bringe ich den SwingWorker dazu den Thread nach erfolgreicher Abarbeitung der doInBackground() zu beenden?
 

mihe7

Top Contributor
done wird aufgerufen, wenn doInBackground beendet ist. Bei Dir also, wenn die while-Schleife terminiert. Läuft die ewig weiter, dann wird done niemals aufgerufen.

Das Prinzip kannst Du dir etwa so vorstellen:
Java:
public class MyWorker implements Runnable {
    public void execute() {
        new Thread(this).start();
    }
    void done() {
        // mach was im UI
    }
    void doInBackground() {
        // mach was im Hintergrund
    }
    public void run() {
        doInBackground();
        SwingUtilities.invokerLater(new Runnable() {
            public void run() {
                done();
            }
        });
    }
    ....
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
C SWT Curser an den Anfang eines Text Objektes setzen AWT, Swing, JavaFX & SWT 12
C Swing Text eines JButton mit String definieren? Reihenfolge? AWT, Swing, JavaFX & SWT 6
T SWT - Text eines TreeItems nachträglich ändern AWT, Swing, JavaFX & SWT 6
G Text eines noch aktiv editierten Textfeldes lesen AWT, Swing, JavaFX & SWT 2
G Text eines Labels verändern? AWT, Swing, JavaFX & SWT 4
S Text eines JButtons vertikal schreiben AWT, Swing, JavaFX & SWT 5
L-ectron-X Den Text eines JButtons unter das Icon setzen? AWT, Swing, JavaFX & SWT 2
L Größe eines JLabels an enthaltenen Text anpassen AWT, Swing, JavaFX & SWT 2
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C JToggleButton disabled Text Color AWT, Swing, JavaFX & SWT 11
H JavaFX Label.Text mit bind an DoubleProperty binden AWT, Swing, JavaFX & SWT 3
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
FrittenFritze Text in Flying Saucer selectierbar machen AWT, Swing, JavaFX & SWT 0
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
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
I Rich Text drucken AWT, Swing, JavaFX & SWT 0
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
N In Textdatei Text anfügen per GUI AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
R Swing JTextField nicht-kopierbarer Text AWT, Swing, JavaFX & SWT 1
S Text-Info in der Taskbar anzeigen AWT, Swing, JavaFX & SWT 15
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
C JCheckBox disabled text color AWT, Swing, JavaFX & SWT 9
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
L JavaFX Anderer Text, wenn kein Platz ist. AWT, Swing, JavaFX & SWT 1
K JavaFX TextInputDialog Button Text ändern AWT, Swing, JavaFX & SWT 1
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
C Swing Spinner als TableCellEditor - Text zu klein AWT, Swing, JavaFX & SWT 2
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
I JavaFX formatierter Text in PDF speichern AWT, Swing, JavaFX & SWT 4
T JavaFX Text des ProgressIndicators ändern AWT, Swing, JavaFX & SWT 2
E Swing Text verschwindet AWT, Swing, JavaFX & SWT 1
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
G Rectangle Breite richtet such an die Breite vom Text AWT, Swing, JavaFX & SWT 1
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
K Rich Text FX von TomasMikula AWT, Swing, JavaFX & SWT 0
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
S JAVAFX HTMLEditor wrap text AWT, Swing, JavaFX & SWT 1
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
A JavaFX HTMLEditor in Text umwandeln AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
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 anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
javampir Java FX Text verschwindet nicht AWT, Swing, JavaFX & SWT 9
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
E To get a color text on the TextArea AWT, Swing, JavaFX & SWT 4
E To get color text on the TextArea AWT, Swing, JavaFX & SWT 5
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JPanel "zeichnet" keinen Text AWT, Swing, JavaFX & SWT 14
U WYSIWYG Text-Editor für JFrames AWT, Swing, JavaFX & SWT 8
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
T MausClick soll TExt ändern AWT, Swing, JavaFX & SWT 6
J Text bei Eingabe löschen AWT, Swing, JavaFX & SWT 5
A SWT Auto completion in text box AWT, Swing, JavaFX & SWT 5
C Geloest: JTextfield: Titel automatisch entfernen, sobald Text eingegeben wird AWT, Swing, JavaFX & SWT 1
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
B Text auf Display ausgeben [LWJGL] AWT, Swing, JavaFX & SWT 2
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
S TextArea get Selected row(Text) AWT, Swing, JavaFX & SWT 6
A Radio Buttons sollen den Text der text Area bestimmen AWT, Swing, JavaFX & SWT 9
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
J LayoutManager Text Spielerein GUI AWT, Swing, JavaFX & SWT 2
H Javafx - Styled Text AWT, Swing, JavaFX & SWT 5
M Text Area 1. Zeile oben AWT, Swing, JavaFX & SWT 4
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
R JavaFX Automatischer Zeilenumbruch in Text AWT, Swing, JavaFX & SWT 13
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
F Dialog mit Titel, Text und Ok Button AWT, Swing, JavaFX & SWT 2
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
TheJavaKid DocumentListener soll Text in JTextField ändern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben