当前位置: 首页 > 知识库问答 >
问题:

JTextField监听器通知顺序

闾丘淇
2023-03-14

我使用一个JTextField,其中我过滤输入进来通过REGEXs和通知用户(背景颜色变化),然后推动更新出一个套接字(字符的字符,而不是一个'点击进入当你完成'的行为,按规格)

问题是,由于没有保证DocumentListener通知的顺序,我不能将更新的传输和更新的验证放在同一种侦听器上。不同类型的监听器(KeyListener vs DocumentListener vs…)之间是否有任何保证的通知顺序用JTextField?

我找不到关于不同类型的监听器之间的有用文档,只能(似乎)在单一类型的监听器(例如DocumentListener)中找到

谢谢

编辑1验证-REGEX验证不允许我禁止任何文本进入,因为额外的字符可能会使无效字符串有效。

行为分离——根据设计,我无法将这两个行为合并到一个侦听器中,它们在代码流中的不同时间设置,并且不能更改。这是一个没有争议的协议设计问题。如果不解释整件事,我真的无法深入更有用的细节。突出的一点是,他们被分成两个听众。我需要在验证步骤之后进行传输步骤,所以我需要知道是否有侦听器类通知的具体定义。我指的是KeyListener vs DocumentListener vs UndoableEditListener。我知道在每种类型的听众中,没有秩序是可以保证的。

但是,是否可以保证DocumentListeners在UndoableEditListeners之前都会得到通知,反之亦然?或者是所有不同类型的听众只是被通知,没有特定的顺序。

编辑2

抱歉,我们好像在杂草丛中迷失了方向。

此刻,我想弄明白的是:

对于JTextField上不同类的侦听器(例如:Key、Document、undobableedit)的通知顺序,Java语言是否有保证?

共有1个答案

郭坚壁
2023-03-14

我不是100%确定你的问题到底是什么,但听起来你真的想使用DocumentFilter,而不是DocumentListener。过滤器在文档提交到JTextField视图之前获取对文档的更改,因此允许对输入进行适当的过滤。不过,我100%肯定你不想使用KeyListener。

编辑你在评论中的陈述:

我需要将这两种行为(过滤/通知用户和传输)分离为两个独立的侦听器。

但是,为什么?为什么是两个监听器?你想使用两个文档过滤器吗?

因为我需要在过滤/验证之后进行更新,所以我不能使用相同类型的侦听器。

“更新”是指传输吗?还是说更新JTextField中显示的文本?

我仍然不确定为什么文档过滤器对您不起作用。如上所述,它允许您在输入显示在JTextField中之前验证输入。这难道不能解决几乎所有的“订单”问题吗?

编辑2

我无法阻止文本输入,因为我正在使用REGEXs进行过滤。所以,一个文本字符串可能是无效的,但可能会变为有效的,所以我不想禁止该字符,因为Java中的正则表达式系统无法确定是否有其他字符可以验证该字符串。所以我必须允许它,但要“验证”它(给它一个确定或不确定)。

好的,明白了。所以你不想不允许无效的输入,只是在它有效之前不传输它,对吗?

因为一些架构体系设计(不管有没有故障,我都不能改变它),我不能将验证和传输这两种行为结合起来(通过标准套接字连接到另一台机器)

这就是我困惑的地方。你能更详细地描述这个限制吗?你到底是如何以这样一种方式传播它的,以至于你不能从听众内部这样做。这对这个问题至关重要(至少就我而言)。

为了结束之前的评论,只有当内容有效时才需要传输,因此验证必须在潜在传输之前进行

所以我猜您当前的伪代码程序工作流程是这样的:

Inside of listener
   get latest text 
   Check if text is valid or not
   if it is valid, then transmit text 
   notify user that valid text has been sent
   ? reset text field
end of listener

这是正确的吗?同样,对我来说最重要的是上述限制。

编辑3
您的状态:

对于JTextField上不同类的侦听器(例如:Key、Document、undobableedit)的通知顺序,Java语言是否有保证?

正如我在评论中所说的,我们可以毫不犹豫地声明文档过滤器肯定在文档监听器之前运行。至于同一个监听器的倍数——正如你所知,这是未定义的。至于多个其他监听器之间的顺序,你可能需要查看源代码来找到答案。再次,请让我们知道您的限制的细节,您绝对需要使用多个监听器的来源。

 类似资料:
  • 我做了一个程序,动态地从一个面板获取数据,但是我的代码需要用户点击输入按钮来更新数据。有没有一个更改监听器或其他监听器可以在任何时候更新Jtext field中的数据?谢谢!

  • 需要一点帮助--这把我累坏了! 我是ReadItToMe的开发人员,这是一款可以读出你的留言并让你通过语音回复的应用程序。去年我一直面临的问题是重复的通知。我将以WhatsApp为例。 我尝试过的解决方案: > 在通知到达时使用通知的标题、消息和包名称创建通知的哈希代码,然后在通知被解除时将其从列表中删除(onNotificationRemoved),从而保持通知列表的读取状态。但我知道什么!在上

  • 主要内容:监听器的分类,监听对象创建和销毁的监听器,监听属性变更的监听器,监听 Session 中对象状态改变的监听器,注册监听器监听器 Listener 是一个实现特定接口的 Java 程序,这个程序专门用于监听另一个 Java 对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即自动执行。 监听器的相关概念: 事件:方法调用、属性改变、状态改变等。 事件源:被监听的对象( 例如:request、session、servletContext)。 监听器:用于监听事件源对象

  • 性能测试就是以各种形式分析服务器响应,然后将其呈现给客户端。 当JMeter的采样器组件被执行时,监听器提供JMeter收集的关于那些测试用例的数据的图形表示。它便于用户在某些日志文件中以表格,图形,树或简单文本的形式查看采样器结果。 监听器可以在测试的任何地方进行调整,直接包括在测试计划下。JMeter提供了大约15个监听器,但主要使用的是表,树和图形。 以下是JMeter中所有监听器的列表:

  • { "name": "...", "address": "...", "filters": [], "ssl_context": "{...}", "bind_to_port": "...", "use_proxy_proto": "...", "use_original_dst": "...", "per_connection_buffer_lim

  • Envoy配置顶层包含一个监听器列表。每个单独的监听器配置具有以下格式: v1 API参考 v2 API参考 统计 监听器 每个监听器都有一个以 listener.<address> 为根的统计树。统计如下: 名称 类型 描述 downstream_cx_total Counter 连接总数 downstream_cx_destroy Counter 销毁的连接总数 downstream_cx_a