JavaFX:如何控制TextField中的输入?

时间:2017-12-27 15:25:16

标签: javafx textfield

我尝试用JavaFX做一个应用程序。 我有一个小问题:

  • 我有一个TextField,我希望它是一个TextField,用于"电话号码" (例如0477 / 40.00.09)。

不幸的是,我无法做到这一点。 我希望那样' /'和'。'总是写在TextField中。 我还希望当用户编写第四个第一个数字时,TextField将光标设置在' /'后面。因此,用户不必照顾' /'和'。'。他只需输入电话号码即可。

我该怎么做?

感谢您的帮助,

Mikis

(抱歉我的英文......)

3 个答案:

答案 0 :(得分:0)

您可以使用TextFormatter来控制TextField中的文本。

问题中描述的PhoneNumber TextField应该执行以下操作:

  • 在4个字符后添加/
  • 在7个和10个字符后添加.
  • 不允许超过13个字符

以下是完成上述所有操作的示例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TextFieldFormatter extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        final TextField textField = new TextField();
        textField.setTextFormatter(new TextFormatter<String>(change -> {

            final int oldLength = change.getControlText().length();
            int newLength = change.getControlNewText().length();

            // Handle backspace
            if (newLength < oldLength) return change;

            // Add / after 4 characters
            // Add . after 7 and 10 characters
            // Do not accept more than 13 characters
            switch (newLength) {
                case 4 :
                    change.setText(change.getText() + "/"); 
                    newLength++;
                    break;
                case 7: case 10:
                    change.setText(change.getText() + "."); 
                    newLength++;
                    break;
                case 14:
                    return null;
            }
            // Set caret position
            change.setCaretPosition(newLength);
            change.setAnchor(newLength);
            return change;
        }));

        BorderPane root = new BorderPane();
        root.setCenter(textField);
        Scene scene = new Scene(root, 200, 200);
        stage.setScene(scene);
        stage.setTitle("TextField Example");
        stage.show();
    }
}

答案 1 :(得分:0)

您可以addListener()到TextField propertyText并控制输入。在您的问题中,您没有提出任何条件,因此您需要一个有用的实现,您可以使用这个简单的代码:

 TextField field = new TextField();

    field.setPromptText("xxxx/xx.xx.xx");
        int maxDigits = 13;
        field.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
            if (newValue.length() == 4 && oldValue.length() != 5) {
                field.setText(newValue + "/");
            } else if (newValue.length() == 7 && oldValue.length() != 8 || newValue.length() == 10 && oldValue.length() != 13) {
                field.setText(newValue + ".");
            }
            if (newValue.length() > maxDigits) {
                field.setText(oldValue);
            }

        });

答案 2 :(得分:0)

最后,我发现了我在这个项目中搜索的内容:

https://github.com/jidesoft/jidefx-oss

但我根据自己的需要调整了它。我是否为新对象“MyMaskTextField”添加了代码?