【问题标题】:JavaFX : How to control input in a TextField ?JavaFX:如何控制 TextField 中的输入?
【发布时间】:2017-12-27 15:25:16
【问题描述】:

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

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

很遗憾,我做不到。 我想要那个'/'和'。总是写在TextField中。 我还想当用户写了第四个第一个数字时,TextField 将光标设置在“/”后面。所以用户不关心'/'和'.'。他只需输入电话号码。

我该怎么做?

感谢您的帮助,

三吉士

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

【问题讨论】:

  • / 是否总是出现在 4 位数字之后?
  • 是的,电话号码的格式(在比利时)是这样的 - 4 位 - / -2 位 - 。 2 位数 - . - 2 位数
  • / editable 是否意味着用户不能删除符号?
  • 没错,用户不能删除符号'/'和'.'

标签: javafx textfield


【解决方案1】:

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

【讨论】:

  • 好吧,TextFormatter,它完成了我想要的一部分:) 但用户没有看到“/”和“。”在输入数字之前?我希望该用户可以在 TextField 中看到“/ . .”(始终,而不是提示文本)。
  • 我不推荐这样实现格式化程序。用户可以通过复制和粘贴一次“输入”多个字符。这意味着您可能永远无法匹配 switch 语句中使用的确切长度,否则修改可能会在错误的时间触发。
  • 你有什么推荐的?
  • @fabian 有办法解决这个问题。这是一个简单的实现,当然有缺陷:)
  • @MikisMillemaci 你希望 TextField 的初始状态为 4 个空格,后跟 / 等等吗?
【解决方案2】:

您可以 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);
            }

        });

【讨论】:

  • 好的,这是做我想做的事的好方法。谢谢你。有没有办法总是有“/ ..”?这对用户很有用,因为他总是必须输入数字。还有'/'和'。无法删除。
  • 当然,如果您以后需要更改文本字段的格式化程序,只需将4 更改为其他变量和您的符号. /
  • 例如,如果您在 / 之前需要 x digits,只需将 4 更改为 x 并遵循此规则:newValue.length() == x &amp;&amp; oldValue.length() != x+1
  • 点击TextField时,提示文字消失。我希望该文本始终保留。所以用户输入“0477”,然后TextField自动将光标设置在“/”后面,用户继续输入“00”,然后自动输入“。” ....
【解决方案3】:

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

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

但我根据自己的需要对其进行了调整。我是否放置新对象“MyMaskTextField”的代码?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2015-11-20
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多