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

问题描述 投票:1回答:3

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

  • 我有一个TextField,我希望它将是一个TextField的“电话号码”(例如0477 / 40.00.09)。

不幸的是,我不能这样做。我希望'/'和'。'总是写在TextField中。我还想在用户编写第四个第一个数字时,TextField将光标设置在'/'后面。因此用户不需要注意'/'和'。'。他只需输入电话号码。

我怎样才能做到这一点 ?

谢谢你的帮助,

伟大

(对不起我的英语不好 ....)

javafx textfield
3个回答
0
投票

您可以使用TextFormatter来控制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();
    }
}

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);
            }

        });

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.