JavaFX Nur Zahlen in Textfield

Daniel_84

Mitglied
Hallo,

ich bin gerade dabei mein mit Java begonnenes Projekt nach JavaFX umzuziehen.
Ich nutze dazu Eclipse Luna und den Scene Builder 2.0.

Soweit klappt auch alles ganz gut nur habe ich bei meinen Textfeldern ein Problem.
Im alten Code habe ich das so gelöst:


Code:
char c = event.getKeyChar();

       
        if (!(Character.isDigit(c)) || (c == KeyEvent.VK_BACKSPACE)||(c == KeyEvent.VK_DELETE))
            {
            event.consume();
            }

Leider klappt das mit meinen Textfeldern in JavaFX nicht mehr.
Hab schon den ganzen Tag gegoogelt und gesucht aber bin auf keine Lösung gestoßen die ich als Anfänger auf anhieb verstanden hätte und die ich zum laufen gebracht hätte.

Ich hoffe ihr könnt mir helfen

Vielen Dank
Daniel
 
Hallo.

Du könntest einen Listener deinem Textfield hinzufügen, der zu ausschaut:

Java:
text.textProperty().addListener(new ChangeListener<String>() {
    @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        if (newValue.matches("\\d*")) {
            int value = Integer.parseInt(newValue);
        } else {
            text.setText(oldValue);
        }
    }
});

Quelle: http://stackoverflow.com/questions/...ded-way-to-make-a-numeric-textfield-in-javafx
 
Zuletzt bearbeitet von einem Moderator:
Du kannst auch eine eigene Komponente erstellen, z.B:

Java:
package de.test;

import javafx.scene.control.TextField;

public class NumberTextField extends TextField {

    @Override
    public void replaceText(int start, int end, String text) {
        if (validate(text)) {
            super.replaceText(start, end, text);
        }
    }

    @Override
    public void replaceSelection(String text) {
        if (validate(text)) {
            super.replaceSelection(text);
        }
    }

    private boolean validate(String text) {
        return ("".equals(text) || text.matches("[0-9]"));
    }
   
}

Einzigstes Problem (was man aber bestimmt lösen kann), mit dem SceneBuilder kannste dann dein FXML nicht mehr öffnen, da er die Komponente nicht kennt. Aber für den SceneBuilder kann man
ja kurz auf normales TextFeld umstellen, und wenn alles paßt wieder die eigene Komponente einsetzen.
 
Danke für die Antworten.

Habe jetzt noch ein bisschen selbst probiert und bin zu folgender Lösung gekommen:

Code:
@FXML public void textfeld_1_keytyped(KeyEvent event){
     
        if (!event.getCharacter().matches("\\d"))
            {
            event.consume();
            }

So funktioniert des genauso wie ich mir des vorstelle.

Danke und Grüße
Daniel
 
Hallo.

Und wie gebe ich ein, dass das TextField Nummern und ein Punkt hat? Und eventuell dass ein Komma Zeichen durch einen Punkt ersetzt wird?
Z.B.: 2.00

Vielen Dank
 

Zurück
Oben