Integerzahl in einem JTextField

plammy

Bekanntes Mitglied
Hallo zusammen..

Ich komme mal mit einem sehr oft vorkommendes Problem und dennoch immer wieder problematisch trotz den ganzen Lösungen im Internet. Es geht um JTextField. Ich möchte das Eingeben von einem bis zu 4stelligen Intergerzahl (zB.: 0 bis 2000)in dem JTextField erlauben.
Ich habe in dem Forum schon ein Thema gefunden, wo verschiedene Beispiele aufgeführt waren wie das gehen sollte.(Meine Klasse IntegerField) Ich hab ausprobiert. Es zeigt mir keinen Fehler aber es funktioniert nicht..🙁 ich kann immer noch Zahlen, Buchstaben unbegrenzt eintippen.

/** Klasse IntegerField **/
Code:
public class IntegerField extends PlainDocument{

   public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException
    {
      try{
             Integer.parseInt(s);
      } 
      catch(Exception ex) {
            Toolkit.getDefaultToolkit().beep();
                        return ;
         }
      insertString(offset,s, attributeSet);
    }
}



/** Panel **/
Code:
public class Panel {
    
    public static JPanel initComponents() {
    ...
        JTextField w_wrapper = new JTextField(new IntegerField(),"",4);
    ...
   }
}

:autsch:
 
Wenn du die Methode insertString() aus deiner IntegerField Klasse nirgends aufrufst, steht sie zwar in deiner Klasse, wird aber niemals ausgeführt.
Im Prinzip brauchst du aber nicht extra ein neues Feld erzeugen (wobei ich mir da sowieso unsicher bin, ob das so funktioniert), sondern es reicht, wenn du deinem ActionListener sagst, er soll versuchen, den Ausdruck zu parsen, und im catch Block in etwa sowas schreibst.
wenn Eingabe == Buchstabe oder Zahl > 2000, dann substring(0, textfield.getText().length()-1)
Dann wird immer die letzte ungültige Eingabe automatisch gelöscht
 
Wenn du die Methode insertString() aus deiner IntegerField Klasse nirgends aufrufst, steht sie zwar in deiner Klasse, wird aber niemals ausgeführt.


Ich sage ja es soll eine Instanz der Klasse IntegerField erstellt werden, womit ich dann auf die Methode zugreife oder nicht?

JTextField w_wrapper = new JTextField(new IntegerField(),"",4);

Im Prinzip brauchst du aber nicht extra ein neues Feld erzeugen (wobei ich mir da sowieso unsicher bin, ob das so funktioniert), sondern es reicht, wenn du deinem ActionListener sagst, er soll versuchen, den Ausdruck zu parsen, und im catch Block in etwa sowas schreibst.
wenn Eingabe == Buchstabe oder Zahl > 2000, dann substring(0, textfield.getText().length()-1)
Dann wird immer die letzte ungültige Eingabe automatisch gelöscht

Welchen ActionListener? :shock:
 
Damit greifst du noch nicht auf die Methode zu. Damit instanziierst du ein Objekt vom Typ IntegerField, mehr aber auch nicht.
Willst du jetzt darauf zugreifen, musst du die Methode irgendwo aufrufen (z.B. im Konstruktor).
Streiche ActionListener, setze KeyListener.
Irgendwie musst du deinem Textfeld ja mitteilen, was es machen soll, wenn da Input ist
 
sry ich weiß immer noch nicht was du meinst ich sollte ActionListener auslassen.. ich hab doch nirgendwo ActionListeer... Kann ich nicht einfach in dem Konstruktor von IntergerField(){} nicht die methode aufrufen.. so wird das bei initialisieren auch die methoden zugegriffen
 
Dann wird einmal die Methode aufgerufen und einmal geprüft, ob die Eingabe stimmt (und zwar direkt beim Programmstart), macht also wenig Sinn.
Listener sind dir aber ein Begriff?
 
ich bin eher auf Stufe Java-Anfänger 🙂.. Ich hab ActionListener für JFileChooser mal benutzt.. aber ansonsten nicht viel damit gearbeitet
 
Dann schau die mal den KeyListener (speziell die Methode keyReleased) an.
Die werden dir dann schon weiterhelfen, wenn du nicht direkt ein JFormattedTextfield nutzen möchtest
 
Leute es lag nur daran dass ich super. ausgelassen hatte 🙂 ich hatte am anfang fehler deswegen bekommen wegen iwie no suitable .. es lag daran dass AttributeSet falsch importiert war von netbeans... statt aus javax.text war das java.print oder so 🙂.. das wars 🙂 funktionier jetzt einwandfrei mit super ohne jegliche andere Änderungen
 
Zuletzt bearbeitet:
Was ist aber noch gerne wissen würde ist Besteht eine Möglichkeit nicht jeden einzelnen TextField .setDocument zu geben sondern iwie für alle? Ich habe nämlich über 40 textfelder und die müssen alle diese Eigenschaft besitzen. Ich will aber keine array[] benutzen weil ich später jeden textfield genau indentifizieren will.
 
Du kannst das in eine For Schleife schreiben.
Java:
JTextField w_wrapper = new JTextField(new IntegerField(),"",4);
 
Aber füe eine foreach-Schleife brauche ich ein array den ich ich durchlaufen kann... Ich will aber kein Array

und ich habe das jetzt mit
w_tile1.setDocument(new IntegerField(4));
umgesetzt
 
Java:
JTextField tf = new JTextField(4);
AbstractDocument aDoc = (AbstractDocument)tf.getDocument();
aDoc.setDocumentFilter(new DocumentFilter(){
      @Override
      public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
            throws BadLocationException {
          Document doc = fb.getDocument();
          String oldString = doc.getLength()>0 ? doc.getText(0,doc.getLength()) : "";
          String newString = oldString.substring(0, offs) + str +
                (doc.getLength() > offs + length ? oldString.substring(offs+length) : "");
          if (testInput(newString)){
              super.replace(fb, offs, length, str, a);
          } else {
              Toolkit.getDefaultToolkit().beep();
          }
      }

      @Override
      public void remove(FilterBypass fb, int offs, int length) throws
                       BadLocationException {
          Document doc = fb.getDocument();
          String oldString = doc.getLength()>0 ? doc.getText(0,doc.getLength()) : "";
          String newString = oldString.substring(0, offs) +
                (doc.getLength() > offs + length ? oldString.substring(offs+length) : "");
          if (testInput(newString)){
              super.remove(fb, offs, length);
          } else {
              Toolkit.getDefaultToolkit().beep();
          }
    }

      private boolean testInput(String inpStr){
          int num;
          if (( inpStr.length() > 1 ) && (inpStr.charAt(0) == '0'))
                  return false;
          try{
              num = Integer.parseInt(inpStr);
          } catch (NumberFormatException e){
              return false;
          }
          return (num > -1 & num < 2001) ? true : false;
      }
});
 

Zurück
Oben