JTextField/JTextComponent 中的选择有限?

2024-03-17

考虑一个 JFormattedTextField(或者任何 JTextComponent,实际上),其中在字段的实际“文本”周围显示有一个前缀和一个后缀。

例如,双 3.5 将是字符串(通过格式化)“3.50”,其周围将是前缀“$”和后缀“”,用于显示文本“$ 3.50”。

显然,这很容易做到。但是,用户仍然可以选择前缀/后缀内的文本,因此他们可以想象删除部分或全部前缀/后缀。我希望用户受到限制,以便根本无法选择前缀/后缀(同时仍然是文本字段的一部分,因此没有 JLabels)。我几乎可以使用 CaretListener(或通过覆盖 setCaretPosition/moveCaretPosition)来完成此操作,这可以防止 C-a 选择整个字段,并且可以防止使用箭头键移动到前缀/后缀。但是,鼠标拖动和 Shift 箭头键仍然允许将选择移动到这些限制区域。

有任何想法吗?


您可以为此使用 NavigationFilter。

下面是一个帮助您入门的示例:

import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class NavigationFilterPrefixWithBackspace extends NavigationFilter
{
    private int prefixLength;
    private Action deletePrevious;

    public NavigationFilterPrefixWithBackspace(int prefixLength, JTextComponent component)
    {
        this.prefixLength = prefixLength;
        deletePrevious = component.getActionMap().get("delete-previous");
        component.getActionMap().put("delete-previous", new BackspaceAction());
        component.setCaretPosition(prefixLength);
    }

    public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias)
    {
        fb.setDot(Math.max(dot, prefixLength), bias);
    }

    public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias)
    {
        fb.moveDot(Math.max(dot, prefixLength), bias);
    }

    class BackspaceAction extends AbstractAction
    {
        public void actionPerformed(ActionEvent e)
        {
            JTextComponent component = (JTextComponent)e.getSource();

            if (component.getCaretPosition() > prefixLength)
            {
                deletePrevious.actionPerformed( null );
            }
        }
    }

    public static void main(String args[]) throws Exception {

        JTextField textField = new JTextField("Prefix_", 20);
        textField.setNavigationFilter( new NavigationFilterPrefixWithBackspace(7, textField) );

        JFrame frame = new JFrame("Navigation Filter Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(textField);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

我相信这就是 JFormattedTextField 的工作原理。所以我不确定您是否可以将其与格式化文本字段一起使用,因为它可能会替换默认行为。

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

JTextField/JTextComponent 中的选择有限? 的相关文章

随机推荐

  • 对于委托接口,Kotlin IllegalAccessError 带有 += 和 -=

    我定义了这个类 class NeverNullMap
  • 如何在偏好更改时重新安排警报管理器

    我有一个 Android 服务 当手机启动时 广播接收器会收到通知 并安排服务以 X 分钟的间隔重复运行 从此以后 每隔 X 分钟 另一个广播接收器就会收到这些通知并启动该服务 该服务完成其工作并退出 到目前为止 一切都很好 现在我希望这
  • $scope.myVariable 未在 Angular-ui 引导模式的控制器中更新

    在我看来 我有一个输入 一个跨度和一个按钮 如下所示 当在文本框中输入内容时 span按预期阅读更新 但当点击按钮时 phoneNumber控制器内部尚未更新 app controller myPopopCtrl scope modalIn
  • 如何将当前行作为 Vim EX 命令执行?

    假设我正在编辑我的 vimrc文件 我刚刚添加了几行 例如一个新的键映射 我不想重新加载whole file so 因为这会重置我正在尝试的许多临时内容 我只想运行我当前正在处理的两条线 我没有运气尝试将这些行复制 粘贴到命令缓冲区中 因为
  • CPU 和数据对齐

    如果您觉得这个问题已经被回答了很多次 请原谅我 但我需要以下问题的答案 为什么数据必须对齐 在 2 字节 4 字节 8 字节边界上 这里我的疑问是 当CPU有地址线Ax Ax 1 Ax 2 A2 A1 A0时 很有可能按顺序寻址内存位置 那
  • 循环枚举、TypeScript 和 JQuery

    你好 我正在尝试使用 TypeScript 和 JQuery 开发一个简单的待办事项应用程序 我有一个列出任务类型的枚举 export enum TaskType FrontEnd BackEnd Designer 然而 使用 jquery
  • 字符串池:“Te”+“st”比“Test”快?

    我正在尝试一些有关字符串池的性能基准 然而 结果并不令人期待 我做了3个静态方法 Perform0 方法 每次都会创建一个新对象 Perform1 方法 字符串文字 Test Perform2 方法 字符串常量表达式 Te st 我的期望是
  • 如何使用 PyYAML 创建当前本地日期和时间

    我希望能够创建一个日期时间对象datetime datetime now PyYAML 调用一些函数很容易 gt gt gt y YAML description Something ts python object apply time
  • iOS 如何从 UISlider 中删除发光/阴影

    如何去除此 UISlider 中的发光 阴影 事实证明 我所需要做的就是设置一个自定义拇指图像 并且阴影不存在
  • 重载 istream 运算符>> C++

    假设我有一个字符向量 我将它作为字符串而不是字符向量推入流中 我如何使用运算符 gt gt 取回字符向量 class C private vector
  • 在 Rails 中提供静态 JSON 对象文件

    如何从 Rails 中的文件提供静态 JSON 对象 我想在ajax调用中访问它 最好的方法是什么 只需将要渲染的内容放入变量中 然后使用render json gt variable列表 字典等都有合理的默认值 看看这个 http gui
  • Spring 相当于 Guice 中的 FactoryModuleBuilder、@AssistedInject 和 @Assisted 的什么?

    是什么Spring框架 http projects spring io spring framework 相当于FactoryModuleBuilder http google github io guice api docs latest
  • Sql Server 死锁对象 ID 太大

    我试图追踪 SQL 2005 数据库 64 位 中发生的死锁 我们目前没有启用快照隔离 我打开 tf 1204 并收到以下输出 从这个输出中 我可以确定节点 1 是一个存储过程 它选择数据并且仅修改 temp 表中的值 节点 2 是另一个存
  • 在运行时更改标记图标

    有没有办法在运行时更改 Google Maps Android API v2 标记的图标 而无需删除 重新添加我想要更改其图标的标记 我可以对其应用变换 如旋转 吗 Thanks 更新后 我可以在运行时轻松更改标记图标Google Play
  • 如何使 TensorFlow 在具有 2.x 功能的 GPU 上运行?

    我已在 Linux Ubuntu 16 04 上成功安装了tensorflow GPU 并进行了一些小的更改 以使其能够与新的 Ubuntu LTS 版本配合使用 然而 我认为 谁知道为什么 我的 GPU 满足计算能力大于 3 5 的最低要
  • Grails 2.4.2 - 动态引用默认数据源

    这个问题已经部分回答了here https stackoverflow com a 10537001 2315900但动态引用默认数据源仍然存在问题 我正在开发一个内部应用程序 它允许开发人员修改我们的多租户应用程序之一的配置设置 并将这些
  • 阻止 IP 地址访问 Heroku 上的 Flask 应用程序?

    我需要在我的网站上阻止一个 IP 地址 在 Heroku 上运行 Flask 应用程序 我看到我的服务器每秒有 50 个请求 这绝对不应该发生 我熟悉在 Apache 服务器上使用 htaccess 这里有类似的东西吗 Gunicorn 服
  • 在 std 命名空间中定义的好友类:有任何保证吗?

    我回答的时候就出现了这个问题这个问题 https stackoverflow com questions 15193108 c unique ptr versus friend class private destructor 151931
  • 在 R 中生成 XML 文档

    在我正在工作的项目中 我需要自动创建一个XML文档取决于用户输入 使用用户输入来修改的部分xml文件对我来说没问题 但我是新创建的xml在 R 中从头开始文档 我想知道是否XML可以使用 R 在 R 中生成如下所示的文档XML or xml
  • JTextField/JTextComponent 中的选择有限?

    考虑一个 JFormattedTextField 或者任何 JTextComponent 实际上 其中在字段的实际 文本 周围显示有一个前缀和一个后缀 例如 双 3 5 将是字符串 通过格式化 3 50 其周围将是前缀 和后缀 用于显示文本