JTextField限制只能输入特定字符

1. 背景

最近写了一个公司内部用的通用MQTT协议JMeter自定义采样器,自定义表达式的处理手法与《JMeter通用Http采样器》https://blog.csdn.net/camelials/article/details/127135630 一致。不同的是协议变了、荷载构造方式变了等。另外,由于结合了自身应用的业务,因此开发难度相比之前的JMeter通用Http采样器大了很多。由于对于请求对象的组装使用了效率相对不高的反射方式,同时还要结合表达式的计算,因此索性把这些事情放在了采样器的前置逻辑阶段用多线程进行处理,这样保障了采样请求组装能力应该是百万/秒左右的级别(直接从Map中取表达式计算、反射方式对象组装的结果,不快那就得有问题了),东西都做的那么细了,那么索性把UI上的事情也抠下细节:限制某些JTextField只能输入特定字符。例如:

  • 采样总数(SampleCount)只能为正整数;
  • 服务器选择权重(ServerChooseWeight)只能为整数(负数表示选择最快的接入点,正数表示强制指定某个接入点)
    如下图:
    在这里插入图片描述

2. IntegerTextField(整数输入框)

import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

/**
 * IntegerTextField
 *
 * @author chenx
 */
public class IntegerTextField extends JTextField {

    public IntegerTextField() {
        super();
    }

    public IntegerTextField(int columns) {
        super(columns);
    }

    @Override
    protected Document createDefaultModel() {
        return new IntegerDocument();
    }

    /**
     * IntegerDocument
     */
    private static class IntegerDocument extends PlainDocument {

        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            if (str == null) {
                return;
            }

            // 只允许输入数字、负号和删除键
            if (!str.matches("[\\d-]+") || (str.equals("-") && offs != 0)) {
                return;
            }

            super.insertString(offs, str, a);
        }
    }
}

3. PositiveIntegerTextField(正整数输入框)

import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

/**
 * PositiveIntegerTextField
 *
 * @author chenx
 */
public class PositiveIntegerTextField extends JTextField {

    public PositiveIntegerTextField() {
        super();
    }

    public PositiveIntegerTextField(int columns) {
        super(columns);
    }

    @Override
    protected Document createDefaultModel() {
        return new PositiveIntegerDocument();
    }

    /**
     * PositiveIntegerDocument
     */
    private static class PositiveIntegerDocument extends PlainDocument {

        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            if (str == null) {
                return;
            }

            // 只允许输入数字和删除键
            if (!str.matches("\\d+")) {
                return;
            }

            super.insertString(offs, str, a);
        }
    }
}

4. 总结

限制 JTextField 输入内容的原理涉及到对文本框中的文本进行监听和过滤。Java中,JTextField 使用 Document 对象来管理文本内容。Document 是一个抽象类,JTextField 默认使用 PlainDocument 的实例来存储文本。

限制输入内容的原理通常涉及两个步骤:
1、监听用户输入: 通过添加文本修改监听器(如 DocumentListener)或者拦截键盘输入事件(如 KeyListener),程序能够实时监测用户的输入行为。
2、过滤非法输入: 当监听到用户的输入时,程序会检查输入内容是否符合要求,如果不符合要求则阻止其插入到文本框中。这一步通常在文本插入方法(如 insertString())中进行处理。

在 Java Swing 中,你可以通过继承 PlainDocument 类并重写其 insertString() 方法来实现对输入内容的过滤和限制。在 insertString() 方法中,你可以编写逻辑来检查插入的文本是否符合规定,如果不符合则阻止其插入,这样就能实现限制输入内容的目的。

好吧,我承认这文章一堆废话,瞅两眼代码就啥都明白了,然而却叨叨了一堆。其实没别的,只是在想什么时候可以让《手撸IM专栏》https://blog.csdn.net/camelials/category_12602237.html初具规模,然后把基于它的JMeter通用MQTT采样器给开源出来,毕竟你搞一个IM 服务端的东西出来,不能没有Client去请求并验证它,否则难免有不能自圆其说的味道了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/585011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第三方软件测试机构的优势

软件测试机构在软件开发和验收过程中扮演着至关重要的角色,其优势主要体现在以下几个方面: 专业性:软件测试机构通常拥有专业的测试团队,这些团队成员具备丰富的测试经验和深厚的专业知识,能够准确识别软件中的潜在问…

Three.js杂记(十五)—— 汽车展览(下)

在上一篇文章Three.js杂记(十四)—— 汽车展览上 - 掘金 (juejin.cn)中主要对切换相机不同位置和鼠标拖拽移动相机焦点做了简单的应用。 那么现在聊聊该如何实现汽车模型自带的三种动画展示了,实际上可以是两种汽车前后盖打开和汽车4车门打开…

大模型实战:如何使用图数据库提高向量搜索精确度?

文本嵌入和向量搜索技术可以帮助我们根据文档的含义及其相似性来检索文档。但当需要根据日期或类别等特定标准来筛选信息时,这些技术就显得力不从心。 为了解决这个问题,我们可以引入元数据过滤或过滤向量搜索,这允许我们根据用户的特定需求…

开源AI智能名片商城小程序:深度解读IMC(IP、MarTech、Content)视角

在数字化浪潮中,私域流量的运营已成为企业不可或缺的增长引擎。而开源AI智能名片商城小程序,则是以一种全新的视角——IMC(IP、MarTech、Content),为企业打开私域流量运营的新篇章。今天,我们就来一起深入解…

Leetcode-17.04. 消失的数字

面试题 17.04. 消失的数字 - 力扣(LeetCode)https://leetcode.cn/problems/missing-number-lcci/ 目录 面试题 17.04. 消失的数字 - 力扣(LeetCode) 题目 解题(注释) 第一种方法 第二种方法 第三种方法 题目 数组nums包含…

【GAMES 101】图形学入门——着色(Shading)

定义:将不同材质内容应用于不同物体对象上的过程。着色只考虑着色点的存在,不考虑其他物体的遮挡等,因此不考虑阴影处理 一些前期内容的定义: 着色点(Shading Point)观测方向(Viewer Directio…

vue 脚手架 创建vue3项目

创建项目 命令:vue create vue-element-plus 选择配置模式:手动选择模式 (上下键回车) 选择配置(上下键空格回车) 选择代码规范、规则检查和格式化方式: 选择语法检查方式 lint on save (保存就检查) 代码文件中有代码不符合 l…

抄表自动化的实现与优势

1.界定与简述 抄表自动化是一种当代关键技术,致力于取代传统的手动式抄表方法,通过远程数据数据采集解决,完成电力工程、水、气等公用事业电力仪表的全自动载入。这一系统利用先进的感应器、物联网技术(IoT)设备及数据数据分析工具&#xff…

西圣全新磁吸无线充电宝强势上线:打开充电新方式,摆脱续航焦虑

在移动互联时代,智能手机、平板电脑等电子设备已经成为我们生活不可或缺的一部分。但随之而来的是电池续航问题的困扰,用户往往需要在户外、旅途或日常生活中频繁地充电。为了解决这一问题,充电宝作为便携式的移动充电设备,已经成…

leetCode61. 旋转链表

leetCode61. 旋转链表 题目思路:见如图所示 代码展示 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* Li…

触发器的启用和禁用

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 在 Oracle 数据库中,所创建的触发器可以根据情况,灵活修改它的状态,使其有效或者无效,即启用或者禁用。 其语法格式如下所示。…

Mac好用又好看的终端iTerm2 + oh-my-zsh

Mac好用又好看的终端iTerm2 1. iTerm2的下载安装2. oh-my-zsh的安装2.1 官网安装方式2.2 国内镜像源安装方式 3. oh-my-zsh配置3.1 存放主题的路径3.2 存放插件的路径3.3 配置文件路径 1. iTerm2的下载安装 官网下载: iTerm2 2. oh-my-zsh的安装 oh-my-zsh是一…

Spirng 当中 Bean的作用域

Spirng 当中 Bean的作用域 文章目录 Spirng 当中 Bean的作用域每博一文案1. Spring6 当中的 Bean的作用域1.2 singleton 默认1.3 prototype1.4 Spring 中的 bean 标签当中scope 属性其他的值说明1.5 自定义作用域,一个线程一个 Bean 2. 总结:3. 最后: 每…

使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B

2024年4月18日,meta开源了Llama 3大模型[1],虽然只有8B[2]和70B[3]两个版本,但Llama 3表现出来的强大能力还是让AI大模型界为之震撼了一番,本人亲测Llama3-70B版本的推理能力十分接近于OpenAI的GPT-4[4],何况还有一个4…

React的路由

1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 npm i react-ro…

人工智慧时代的引擎:揭开机器人核心零部件的奥秘

机器人核心零部件技术现状及趋势 工业机器人是我国制造业的“顶冠明珠”,在机器人核心零部件的研发制造上,我国在很多方面已经接近国际顶尖水平,但一些核心技术仍无法满足复杂高端领域应用需求,如精密减速器的传动精度与寿命间竞争…

「玻尔曾孙」领衔!超辐射原子,重塑全球精准测时——

超辐射原子能够帮助我们以前所未有的精度测量时间。在哥本哈根大学最近的一项研究中,研究人员开发了一种新的测量时间间隔(秒)的方法,这种方法克服了目前最先进原子钟面临的一些限制。 这一成就有望在多个领域产生深远影响&#x…

C语言进阶|双链表

✈链表的分类 链表的结构非常多样,以下情况组合起来就有8种(2x22)链表结构: 虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:单链表和双向带头循环链表 1.无头单向非循环链表:结构简单&…

[iOS]使用CocoaPods发布公开库

1.检查库名是否已被占用 选择库名时,尽量选择具有描述性并且独特的名字,这不仅可以避免命名冲突,还可以帮助用户更好地理解库的用途和功能。 在实际创建和发布 CocoaPods 库之前,确实应该检查库名是否已经被占用,以避…