refreshing GUI Labels

04/29/2015 23:07 EinfachSö#1
Hi,

Mein Problem ist kurz erklärt.
Ich habe ein GUI erstellt, in das man 3 Eingaben tätigen kann. Einmal die Länge (einer img-Datei), den Dateinamen und einen counter.
Nun ist es so, dass ich Listen von Daten habe. Diese haben bis 22,5 Mio. Elemente. Wurzel von 22,5 Mio sind ca. 4743. Bei einem quadratischen Bild ergibt das die maximale Seitenlänge.
Der Counter ist dafür da um jedes xte Element zu nehmen. Bei einem Counter von 2 wäre es dann: 22,5 Mio./sqrt(2)= max. Seitenlänge des Bildes.

Nun möchte ich, dass wenn man die Zahl für den Counter in das Textfeld eingibt, dass unter dem Feld für die Länge ein kleiner Text steht, der die maximale Länge angibt. Die Formel von oben habe ich ja. Aber wie kann ich es schaffen, damit meine GUI sich automatisch aktualisiert ohne, dass ich einen Button betätige? Also, ich gebe eine Zahl für den Counter in das Textfeld ein und der Hinweis ändert sich direkt.

Mfg
EinfachSö

Code:
Möglicher Code für das "Feature"

04/30/2015 12:07 RecK#2
Du hast die Optionen einen ActionListener zu registrieren auf deinem TextFeld, hast du es damit versucht?

Weitere Alternativen wäre ein KeyListener der bei jeder Zeicheneingabe überprüft ob der "gewünschte" bzw. erwartete Wert eingegeben wurde. Oder du könntest für jede Zeicheneingabe einen kurzen Timeout registrieren und wenn danach kein neues Zeichen eingegeben wird, aktualisierst du das Label.

Ansonsten habe ich bei StackOverflow vermehrt sowas gesehen:
Code:
textField.getDocument().addDocumentListener(new DocumentListener() {
   public void changedUpdate(DocumentEvent e) {
      // text changed?
   }
   public void removeUpdate(DocumentEvent e) {}
   public void insertUpdate(DocumentEvent e) {
     // text inserted?
   }
});
[Only registered and activated users can see links. Click Here To Register...]

Habe ich selber aber noch nicht benutzt.
05/01/2015 17:39 EinfachSö#3
Quote:
Originally Posted by RecK View Post
Du hast die Optionen einen ActionListener zu registrieren auf deinem TextFeld, hast du es damit versucht?

Weitere Alternativen wäre ein KeyListener der bei jeder Zeicheneingabe überprüft ob der "gewünschte" bzw. erwartete Wert eingegeben wurde. Oder du könntest für jede Zeicheneingabe einen kurzen Timeout registrieren und wenn danach kein neues Zeichen eingegeben wird, aktualisierst du das Label.

Ansonsten habe ich bei StackOverflow vermehrt sowas gesehen:
Code:
textField.getDocument().addDocumentListener(new DocumentListener() {
   public void changedUpdate(DocumentEvent e) {
      // text changed?
   }
   public void removeUpdate(DocumentEvent e) {}
   public void insertUpdate(DocumentEvent e) {
     // text inserted?
   }
});
[Only registered and activated users can see links. Click Here To Register...]

Habe ich selber aber noch nicht benutzt.
Mit einem ActionListener klappt es nicht. Auch laut anderer Aussagen.
Der KeyListener stellt mich im Moment noch vor eine Herausforderung. Er will das Label nicht ändern. Ich habe gelesen, dass man darauf achten muss, was das Programm fokussiert und es da viele Probleme gibt.

Ich designe das Programm lieber etwas um. Es gibt zum Glück keinen Error, wenn die max. Länge überschritten wird. Das Ergebnis wird bloß unschön. (Bild mit weißen Rändern.
05/01/2015 20:31 qqdev#4
Der ActionListener muss eigentlich funktionieren. Wird nix getriggert, oder was ist das Problem?
05/02/2015 02:21 Garuga#5
Nun mit Swing habe ich anfängliche Kenntnisse und bin anfangs auch auf viele Probleme gestoßen.. Soweit ich mich erinnere können zumindest einige initialisierte Komponenten nicht verändert werden. Nutz einfach JavaFX, dort solltest du auf solche Probleme nicht stoßen. Desweiteren wird das in den nächsten Jahren Swing sowieso ersetzen, da es schon länger kein vernünftiges Update hatte und somit vieles veraltet ist..


Zum eigentlichen Problem:

In JavaFX gibt es einen OnChange Event für Textfelder dass jedes mal ausgeführt wird, sobald sich der Inhalt ändert. Du müsstest dann vorher einfach überprüfen ob eine gültige Zahl im Feld steht und deine Berechnung durchführen, die dann einfach den Inhalt des Labels setzt..
05/02/2015 13:38 Zunft#6
Code:
jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                jTextField1KeyTyped(evt);
            }
        });

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {                                     
        jLabel1.setText(jTextField1.getText());
    }
Und das war es auch schon.

Ansonsten benutzt du einfach das ActionPerformed-Event. Da muss der Nutzer zwar mit Enter bestätigen, aber dafür ist es weniger Fehleranfällig.

Ich würde dir auch JavaFX ans Herz legen in Verbindung mit dem Scene Builder. Allerdings solltest du eine gute Struktur im Quellcode haben, da ein größeres Projekt recht schnell unübersichtlich wird.

*Edit: Der DocumentListener ist natürlich um einiges eleganter:

Code:
jTextField1.getDocument().addDocumentListener(new DocumentListener() {
  public void changedUpdate(DocumentEvent e) {
  }
  public void removeUpdate(DocumentEvent e) {
  }
  public void insertUpdate(DocumentEvent e) {
    jLabel1.setText(jTextField1.getText());
  }
});