# Eingabefelder nur für bestimmte Werte



## bröggle (25. Jun 2004)

Hi, 
ich möchte mir ein kleines Programm basteln, bei dem der User in ein Eingabefeld Zahlen eintragen kann.

Ist es möglich die Eingabe möglichkeiten bereits bei der Eingabe zu beschränken?
1.Nur Zahlen
2.Zahlen innerhalb eines bestimmenten Wertebereichs
3.Nur Ganzzahlen
4.Die ein Zahl muss größer als die andere sein...


Ist dies möglcih?

evtl mit codebeispiel...


----------



## L-ectron-X (25. Jun 2004)

Schau Dir mal die Klasse JFormattedTextField an.
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JFormattedTextField.html

Mit einem Codebeispiel kann ich Dir leider nicht behilflich sein.


----------



## Niki (9. Jul 2004)

du kannst auch ein eigenes textfeld basteln, welches du von JTextField ableitest, dann die Methode createDefaultModel überschreibst und ein eigenes Document zurück gibst:


```
public class MyNumericTextField extends JTextField{

    protected Document createDefaultModel(){
        return new NumericDocument();
    }

    private class NumericDocument() extends PlainDocument{

        //Überschreiben der Methode von PlainDocument, wenn der String korrekt ist super.insert aufrufen, ansonsten   nix
        //machen
        public void insert(int offset, String s, AttributeSet a){
            StringBuffer sb = new StringBuffer(getText());
            sb.insert(offset, s);
            char[] c = sb.toString().toCharArray();

            //Überprüfen, ob der übergebene String korrekt ist, wenn nicht Methode verlassen
            for(int i = 0; i < c.length; i++){
                if("0123456789".indexOf(""+c[i]) == -1)
                    return;
            }            

            //String ist korrekt, also super.insert aufrufen
            super.insert(offset, s, a);
        }
    }
}
```

vorteil von dieser methode ist, dass sie jdk unabhängig ist, sollte immer funktionieren, nachteil, es ist recht aufwendig


----------



## L-ectron-X (9. Jul 2004)

Ich habe mal in einem Programm eine Prüfung auf Zeichen so vorgenommen:

```
String text = textfeld.getText().trim();

for(int i = 0; i < text.length(); i++) {
  if(Character.isLetter(text.charAt(i))) {
    //was gemacht werden soll, wenn ein Zeichen gefunden wurde
  }
}
```


----------



## bygones (9. Jul 2004)

auja - wieder "was für möglichkeiten es gibt"  :lol:  :roll:  :wink: 
(erlaubt nur zahlen von 3 - 7)

```
public class Test extends JFrame {
    public Test() {
        super("f");
        setSize(100,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTextField f = new JTextField();
        f.addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                char c = e.getKeyChar();
                if(Character.isLetter(c)
                        || c < '3' || c > '7' ) {
                    System.out.println("h");
                    e.consume();
                }
                else {
                    f.setText(f.getText() + c);
                }
            }

            public void keyReleased(KeyEvent e) {
                e.consume();                
            }

            public void keyTyped(KeyEvent e) {
                e.consume();                
            }
        });
        getContentPane().add(f);
        setVisible(true);
    }
    public static void main(String[] args) throws IOException {
        new Test();
    }
}
```


----------



## Niki (12. Jul 2004)

Frage: wird die keypressed nicht erst ausgeführt, nachdem der charakter hinzugefügt wurde???


----------



## bygones (12. Jul 2004)

Niki hat gesagt.:
			
		

> Frage: wird die keypressed nicht erst ausgeführt, nachdem der charakter hinzugefügt wurde???


Ne - alle anderen Events werden ja unterdrückt !


----------



## Niki (12. Jul 2004)

habs gerade ausprobiert, verdammt, funktioniert wirklich, und ich hab geglaubt man muss immer das model überschreiben, was aufwendig ist....


----------



## Stefan1200 (13. Jul 2004)

Habe diesen Thread jetzt nur überflogen, aber vielleicht hilft die das auch.
Für manche Anwendungszwecke kann man auch ein JSpinner verwenden.
Da kann man ein Bereich von Zahlen angeben, oder halt Zahlen oder Strings vordefinieren.
In manchen Fällen ganz praktisch das Teil.


----------

