Swing Text eines Lables in einer Methode ändern

Diskutiere Text eines Lables in einer Methode ändern im AWT, Swing, JavaFX & SWT Forum; 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...

  1. kevin9r
    kevin9r 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:
    Code (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 :

    Code (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.
     
  2. Vielleicht hilft dir dieses Training hier weiter.
  3. Robat
    Robat Bekanntes Mitglied
    Du musst den gesamten Code, der die Daten aus dem Netz holt, in einen separaten Thread auslagern.
     
  4. stg
    stg Bekanntes Mitglied
    In dem von dir geposteten Schnipsel ist von diesem Problem aber nichts zu sehen....
    Poste doch in deinem eigenen Interesse ein MCVE hierzu.
     
  5. mihe7
    mihe7 Bekanntes Mitglied
    Warum nur habe ich diese Bilder von drei Buchstaben (E, D und T) in meinem Kopf?
     
  6. kevin9r
    kevin9r Mitglied
    Ok ich Versuchs mal..

    Der button ruft die Methode auf :

    Code (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();
    }

    Code (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 = "";
                }

    // ...
    }
    Code (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.
     
  7. mihe7
    mihe7 Bekanntes 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.
     
  8. kevin9r
    kevin9r Mitglied
    Info ist das Label.

    Code (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 (Text):
    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.
     
  9. mihe7
    mihe7 Bekanntes Mitglied
    OK, zwei Dinge: mach mal bitte
    Code (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).
     
  10. kevin9r
    kevin9r 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:

    Code (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.
     
  11. mihe7
    mihe7 Bekanntes 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.
     
  12. Wenn du Java lernen möchtest, empfehlen wir dir diese Online-Training hier
Die Seite wird geladen...

Text eines Lables in einer Methode ändern - Ähnliche Themen

Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout,
Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, im Forum Java Basics - Anfänger-Themen
Extern den Text eines nicht fetsgelegten Buttons bekommen.
Extern den Text eines nicht fetsgelegten Buttons bekommen. im Forum AWT, Swing, JavaFX & SWT
Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen
Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen im Forum XML und Co.
Inhalt eines externen Textdokuments an einen String übergeben
Inhalt eines externen Textdokuments an einen String übergeben im Forum Java Basics - Anfänger-Themen
Menge der Buchstaben eines Textes zählen
Menge der Buchstaben eines Textes zählen im Forum Allgemeine Java-Themen
Thema: Text eines Lables in einer Methode ändern