JavaFX TextField 验证整数输入,并且还允许最后 K 或 k(代表千)或 M 或 m(代表百万)

2023-12-11

我想在 javafx TextField 中添加验证,以便用户只能插入整数值( [0-9] 和 Dot )。用户还应该能够插入 B 或 b(代表十亿)、K 或 k(代表千)和 M 或 m(代表百万)。基本上它应该是一个金额字段。删除和退格键也应该有效。

例如 :

一旦用户点击 k,10k 就应该变成 10,000.00,并且 K 不应该显示在 amountfield(文本字段)上 同样,10M 或 10m 应转换为 10,000,000.00

不允许在文本字段中输入 adsadi342fn3 或 31233123werwer 或 dsad342134k。

我在 Swing 的情况下验证 TextField 时使用了 getKeyChar 方法。但如果 JavaFx 没有 getKeyChar 方法,我需要相同的实现。

我使用了以下方法,但问题是它允许用户输入任何值。示例:sdafewr23rf

private void amountEntered() {
        if (amountField != null) {
            String value;
            char[] charArray = amountField.getText().toCharArray();
            if (charArray.length > 0)
                switch (charArray[charArray.length - 1]) {
                    case 't':
                    case 'T':
                        value = multiplyValue(amountField.getText(), new BigDecimal(1000000000000.0));
                        updateAmount(value);
                        break;
                    case 'b':
                    case 'B':
                        value = multiplyValue(amountField.getText(), new BigDecimal(1000000000.0));
                        updateAmount(value);
                        break;
                    case 'm':
                    case 'M':
                        value = multiplyValue(amountField.getText(), new BigDecimal(1000000.0));
                        updateAmount(value);
                        break;
                    case 'k':
                    case 'K':
                        value = multiplyValue(amountField.getText(), new BigDecimal(1000.0));
                        updateAmount(value);
                        break;
                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                    case '.':
                    case ',':
                        updateAmount(amountField.getText());
                        break;
                    default:
                        break;
                }
        }
    }

private String multiplyValue(String number, BigDecimal multValue) {
        //get rid of "," for double parsing
        BigDecimal value = new BigDecimal(cleanDouble(number.substring(0, number.length() - 1)));
        value = value.multiply(multValue);
        return value.toPlainString();
    }

除了监听文本属性的变化并在它们无效时恢复,您还可以使用TextFormatter否决对文本的更改。使用这种方法将避免其他听众textProperty看到无效值,然后看到它恢复到以前的值:即textProperty将始终包含有效的内容。

The TextFormatter需要一个UnaryOperator<TextFormatter.Change>它充当过滤器。过滤器可以返回 null 来完全否决更改,或者可以修改Change如所须。

这是一个相当简单的示例,其中“k”或“K”被“000”替换,“m”或“M”被“000000”替换,并且其他非数字字符被删除:

import java.util.function.UnaryOperator;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TextFieldFilteringExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextField textField = new TextField();

        textField.textProperty().addListener((obs, oldValue, newValue) -> {
           System.out.println("Text change from "+oldValue+" to "+newValue);
        });

        UnaryOperator<Change> filter = change -> {
            if (change.isAdded()) {
                String addedText = change.getText();
                if (addedText.matches("[0-9]*")) {
                    return change ;
                }
                // remove illegal characters:
                int length = addedText.length();
                addedText = addedText.replaceAll("[^0-9kKmM]", "");
                // replace "k" and "K" with "000":
                addedText = addedText.replaceAll("[kK]", "000");
                // replace "m" and "M" with "000000":
                addedText = addedText.replaceAll("[mM]", "000000");
                change.setText(addedText);

                // modify caret position if size of text changed:
                int delta = addedText.length() - length ;
                change.setCaretPosition(change.getCaretPosition() + delta);  
                change.setAnchor(change.getAnchor() + delta);
            }
            return change ;
        };

        textField.setTextFormatter(new TextFormatter<String>(filter));

        StackPane root = new StackPane(textField);
        root.setPadding(new Insets(20));
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

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

您还可以修改文本以引入分组分隔符(例如 1,000,000),尽管其中的逻辑变得相当棘手。您还可以另外指定一个StringConverter<BigInteger>对于文本格式化程序,以便格式化程序本身具有 type 的值BigInteger这是通过提供的转换器传递文本的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX TextField 验证整数输入,并且还允许最后 K 或 k(代表千)或 M 或 m(代表百万) 的相关文章

  • 向 Windows 任务栏缩略图添加按钮 JavaFX?

    这个问题已经闲置一年多了 我的问题仍然没有解决方案 我编辑此内容是为了澄清我的问题并引起人们对它的新关注 如果您使用 Windows 您可能知道将程序图标悬停在任务栏上时显示的小预览图像 缩略图 某些程序 例如 Spotify Git 扩展
  • 从后台线程更新可观察列表的正确方法

    我正在尝试遵循 MVC 进行测试项目 因此我的模型应该完全独立于我的观点 但是我不确定应该如何更新在后台线程中更新的可观察列表 正在给出有关上传的字符串 文件 以便消息显示在 UI 上的 ListView 中 我正在使用 JavaFX 并尝
  • 如何从我自己的线程安全地修改 JavaFX GUI 节点?

    我尝试更改线程中的 JavaFX GUI 节点 但看到以下错误 线程 Thread 8 中的异常 java lang IllegalStateException 不存在 FX应用线程 当前线程 线程 8 生成错误的示例代码 public c
  • 尝试让 GUI 使用 arrayList 在牌组中打印随机卡

    所以我目前正在用java开发一个卡牌战争游戏 我试图让 GUI 屏幕使用 arrayList 从一组卡片图像中打印 2 张随机卡片 必须使用它进行分配 卡片图像文件名为 1 png 2 png 52 png 并存储在 image card
  • 如何使用 Java 11 和 JavaFX 11 运行 ControlsFX 示例应用程序

    ControlFX 网站 http fxexperience com controlsfx says 如果您想使用 ControlsFX 示例应用程序 只需 下载 ControlsFX 版本并在上运行以下命令 命令提示符 请务必将 替换为实
  • JQuery 使用一个复选框以编程方式取消选中其他复选框

    我正在寻找一个脚本 其中一个复选框将取消选中另一个复选框 虽然有点复杂 因为所有数据都是以编程方式加载的 因此 如果未选中某个复选框 则过程将获取其 src 值 然后遍历其他输入并查找标题为 RQlevel 单击元素的 src 值的输入 并
  • JavaFX中如何获取鼠标位置?

    我是java fx 的初学者 如何在 JavaFX 中获取鼠标在 x 和 y 中的位置 我尝试使用 AWTMouseInfo 也导入了它 但它不起作用 我还在 Ensembles 中看到了它的代码 在 高级阶段 拖动球窗口 这就是我需要做的
  • Windows 控制台中的 C++ 按键输入

    我目前正在开发各种consoleWindows 中的游戏无法通过常规输入真正运行cin 我怎样才能 以简单的方式仅使用 MSVC 中提供的标准 Windows 库 让程序等待 特定 按键并返回按键 ID 它必须适用于包括箭头键在内的所有按键
  • JavaFX 中的内部框架

    我找到了这个内部框架的例子 http docs oracle com javase tutorial uiswing components internalframe html http docs oracle com javase tut
  • jQuery 输入事件在 IE 中的占位符上触发

    我有一个输入字段input绑定到它的事件 通过 jQuery 每次输入值更改时都应触发此事件 我添加了一个占位符来告诉用户此输入字段的用途 如果用户单击此输入字段input不应触发事件 该值实际上不会改变 只是占位符消失 它在 Firefo
  • Python:如何从文件中的一行读取字符并将它们转换为浮点数和字符串,具体取决于它们是数字还是字母?

    我有一个如下所示的文件 1 1 C C 1 9873 2 347 3 88776 1 2 C Si 4 887 9 009 1 21 我想逐行读取文件的内容 当我使用的行上只有数字时 for line in readlines file d
  • 如何声明文本字段只能包含整数?

    在 swift 中 我试图创建一个文本字段 该文本字段将允许启用按钮 但仅当文本字段包含整数时 我怎样才能做到这一点 两件事情 指定键盘类型以仅显示数字键盘 所以 设置keyboardType to numberPad 然而 这还不足以阻止
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • 无法解析符号“javafx.scene.web”

    使用Intellij 2021 3 2 JavaFX版本 11 0 2 1 我正在尝试将 JavaFX WebView 添加到我的应用程序中 我的导入语句无法编译 import javafx scene web 编译错误 java 找不到符
  • JavaFX 如何在不改变线宽的情况下缩放路径的坐标?

    我目前正在制作具有缩放和平移功能的阶梯折线图 由于我需要处理的数据量非常大 因此每次调用layoutPlotChildren 时 我无法重新创建步骤线的整个路径 所以我的想法是创建一次路径元素 然后在缩放和平移事件时对其进行转换 到目前为止
  • 如何在 JavaFX 中将 FontAwesome 升级到版本 5

    我有一个使用 FontAwesome 图标的 JavaFX 我想使用新版本 5 但似乎已经不起作用了 这是一个用 Groovy 编写的简单演示应用程序 可与旧版 FontAwesome 一起使用 import javafx applicat
  • 使用 jQuery/JavaScript 将文本框值复制到剪贴板

    我有一个文本框和按钮 如下所示 div class col xs 11 style padding 20px 0 div
  • JavaFX 中 WebView 的性能

    我有一个 HTML5 UI 和一个 Java 后端 并且希望避免在纯 java 中重建 HTML ui 所以我的想法是运行本地 Web 服务器并使用 WebView 在 本机 窗口中呈现它 解决方案似乎是使用可以嵌入到 swing 中的 J
  • Javafx 从 TextField 获取输入

    这是我当前的代码 它所做的只是为我制作的计算器设置一个 GUI 界面 我希望用户输入两个值 然后当按下 Sum 按钮时 它将两个值加在一起并将其显示在 Sum 文本字段中 我正在尝试使用 JavaFX 如果您能提供一些帮助 我将不胜感激 i
  • Javafx 组合框不会在实时更改时更新下拉列表大小?

    我正在使用 Javafx v8 0 25 b18 我出现的问题是动态组合框的下拉列表的大小不会改变 所以如果我最初在下拉列表中有两个项目 那么下拉列表大小将适合两个项目 但如果我现在用以下内容填充动态组合框三个项目 然后我在里面得到一个小滚

随机推荐

  • PHP摩尔斯电码转换器

    我正在用 PHP 编写一个基本的莫尔斯电码转换器 它可以接受一个字符串并将其转换为莫尔斯电码 它使用关联数组 foreach 循环和for 循环 它可以工作 除了由于某种原因它在每个转换后的字符后输出与 0 等效的莫尔斯电码 我不知道0是从
  • 在 mail.body 中查找“回车符”

    我有这样的邮件 Hello 请注意 我们在 16 点 15 分 已采取的行动 重建等 真挚地 Mr 每封邮件中的操作都会发生变化 我想要的是将操作插入到我的 Excel 中 问题是我不知道如何获得 回车符 我不知道这是否是正确的名称 这就是
  • Volley SSL - 主机名未验证

    我正在开发一个 Android 应用程序 我需要访问 HTTPS 地址 我正在使用 Volley 请求我的数据 但现在我收到此错误com android volley NoConnectionError java io IOExceptio
  • 如何实现JavaFX和非JavaFX交互?

    我已经开始使用 JavaFX 创建一个用于用户交互的窗口 以便在另一个非 JavaFX 程序中使用 我的主程序叫做Abc类 有一个 main 方法 这是一个非 JavaFX 程序 而是普通的 Java 该程序运行一些活动 然后要求用户选择一
  • java使用过多内存

    在我的一个项目中 我不断压缩小数据块 现在我发现jvm随后增长到6GB RAM 常驻 RES RAM 不是共享或虚拟等 然后由于内存不足而死掉 就好像垃圾收集器从未运行过一样 我已经提取了相关代码并将其粘贴在下面 当我运行它 java6 3
  • moment js 中的自定义长日期格式

    有没有办法根据区域设置将自定义格式代码添加到长日期时刻 例如 moment format L 是一种现有格式 它将打印区域设置的长日期 包括年份 但如果我想添加自己的排除年份的格式 如下所示 moment format LTY 它只是打印给
  • 部分专业化消歧优先链的更好模式?

    考虑以下一系列部分专业化 template
  • 根据索引将一个数据帧除以另一个数据帧

    我试图将数据帧的行除以另一个数据帧中的相同索引行 每个数据帧中有相同数量的列 目标是将一个列列表除以另一个列列表 有没有办法在 Pandas 中做到这一点 这是一个示例数据 import pandas as pd import numpy
  • 如何使用 Selenium WebDriver 从隐藏元素读取文本?

    我正在尝试阅读示例字符串1000从隐藏的 div 像这样 div 1000 div 我知道WebElement getText 不适用于 Selenium 2 WebDriver 中的隐藏元素 因此我搜索了解决方案 像这个 显然下面的代码应
  • 在 ggplot2 中的单个图上绘制 3 个变量

    您好 有一个由三个变量组成的实验 我想将它们全部绘制在一个图上 这是我的 df AB lt data frame block c A A A A B B B B familiarity c fam fam unfam unfam prime
  • 4x4 应用程序小部件在平板电脑上被检测为 3x3

    我创建了一个 4x4 appwidget 将 minWidth 和 minHeight 设置为 250dp 如建议的那样 应用程序小部件设计指南 http developer android com guide practices ui g
  • 在 Razor 的 Javascript 中嵌入 Html.ActionLink

    我知道可以在 MVC3 的 Javascript 中嵌入 Html 但我无法让以下内容工作 并且不确定这是否可能 使用 jQuery DataTable 我通过 AJAX 调用来创建新行 然后使用数据表 API 以编程方式添加它 这一切都有
  • 为什么 FederatedAuthentication.WSFederationAuthenticationModule 在 MVC Azure ACS 联合身份验证中为 null?

    我试图将 FederatedAuthentication 与 NET 4 5 MVC 4 和使用自定义服务器端登录页面的主动重定向结合在一起 使用来自的代码this教程 以及来自this代码示例 重定向到我的 AccountControll
  • 如何让 sed 进行非贪婪匹配? [复制]

    这个问题在这里已经有答案了 我似乎无法弄清楚如何为我的 bash 命令行提出正确的正则表达式 这就是我正在做的事情 echo XML Xerces 2 7 0 0 tar gz sed e s 0 9 1 g 这给了我 的输出 XML Xe
  • 在 NativeScript 和 Angular2 中获取元素值

    我有一个列表 我想获取列表项的值 视图如下
  • m2eclipse - 没有 SCM 连接器?

    我已将 m2eclipse 插件安装到没有连接到互联网的远程计算机 我通过复制以下内容来手动安装插件features and plugins目录 现在当我试图从 SCM 签出 Maven 项目 我的本地存储库 它没有向我显示任何连接器 虽然
  • 防止背景图像在滚动时调整大小

    当我从顶部滚动时 背景图像的大小会稍微调整移动设备 当我再次滚动到顶部时 它又恢复到原来的大小 你可以看到here 我尝试使用 背景附件 固定 除了所有其他 css 代码之外 您可以在下面看到它 但它不起作用 css bg 1 bg 2 b
  • 如何在 python-fedex 中为国际货件添加海关价值?

    我正在使用python fedex模块作为 FedEx SOAP API 的轻型包装器 作为其中的一部分 我试图建立一个国际货运的基本示例 但我遇到了以下错误消息 fedex base service FedexError Customs
  • iPhone:使用属性解析XML文件

    我想解析 XML 文件 我能够解析简单的 XML 文件 但很少有复杂的XML文件
  • JavaFX TextField 验证整数输入,并且还允许最后 K 或 k(代表千)或 M 或 m(代表百万)

    我想在 javafx TextField 中添加验证 以便用户只能插入整数值 0 9 和 Dot 用户还应该能够插入 B 或 b 代表十亿 K 或 k 代表千 和 M 或 m 代表百万 基本上它应该是一个金额字段 删除和退格键也应该有效 例