我正在使用JTextField,其中我过滤通过REGEX进入的输入并通知用户(背景颜色更改)然后通过套接字推送更新(逐个字符,而不是'当你输入时输入'完成'某种行为,按规格)
问题是,由于没有保证DocumentListener通知的顺序,我不能同时将更新的传输和更新的验证放在同一类型的监听器上。在使用JTextField的不同类型的监听器(KeyListener与DocumentListener vs ...)之间是否有任何保证通知顺序?
我找不到关于不同类型的监听器之间的有用文档,只能(似乎)在一种监听器中(例如DocumentListener)
谢谢!
编辑1 验证 - REGEX验证不允许我禁止任何文本进入,因为其他字符可能会使“无效”字符串“有效”。
行为分离 - 通过设计,我无法将这两个行为合并到一个侦听器中,它们是在代码流中的不同时间设置的,并且无法更改。这是一个协议设计问题,不值得辩论。如果不解释整个事情,我真的无法进入更有用的细节。重点是他们只是分成两个听众。我需要在验证步骤之后进行传输步骤,因此我需要知道是否存在监听器KIND通知的CONCRETE定义。按类型我的意思是KeyListener vs DocumentListener vs UndoableEditListener。我知道在每种听众中都没有保证秩序。
但是,是否可以保证在UndoableEditListeners之前通知DocumentListeners,反之亦然?或者是所有不同类型的听众只是以无特定的顺序通知。
编辑2
对不起,好像我们在杂草硬币中迷路了。
此时此刻,我想弄清楚的是:
对JTextField上不同类的Listener(例如:Key,Document,UndoableEdit)的通知顺序是否有Java语言保证?
答案 0 :(得分:2)
我并不完全确定你的问题是什么,但听起来你真的想要使用DocumentFilter,而不是DocumentListener。过滤器在将文档提交到JTextField视图之前会对文档进行更改,因此可以对输入进行适当的过滤。我完全可以肯定您不想要使用KeyListener。
修改强>
您在评论中说明:
我需要将两个行为(过滤/通知用户和传输)分离为两个独立的侦听器。
但是,为什么呢?为什么两个听众?您是否尝试使用两个DocumentFilters?
由于我需要在过滤器/验证后进行更新,因此无法使用相同类型的侦听器。
通过“更新”,你的意思是传输?或者您的意思是更新JTextField中显示的文本吗?
我仍然不确定为什么文档过滤器不适合您。如上所述,它允许您在输入显示在JTextField之前验证输入。这不会解决任何“订单”问题吗?
修改2
我无法阻止文本输入,因为我使用REGEX进行过滤。因此,一串文本可能无效,但可能变为有效,因此我不想禁用该字符,因为Java中的REGEX系统无法确定其他字符是否可以验证字符串。所以我必须允许它,但“验证”它(给它一个好或不好)。
好的,明白了。所以你不想不允许无效输入,只是在它有效之前不传输它,对吗?
由于某些基础设施设计(故障与否,我无法改变)我无法将验证和传输的两种行为(通过标准套接字连接到另一台机器)结合起来。
这是我很困惑的地方。你能更详细地描述这个限制吗?你是如何以一种你不能从听众内部这样做的方式传播它的呢?这对这个问题至关重要(至少就我而言)。
要从之前的评论中完成,传输只需要在内容有效时进行,因此验证必须在潜在传输之前进行
所以我猜你当前的伪代码程序工作流程是这样的:
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上不同类的Listener(例如:Key,Document,UndoableEdit)的通知顺序是否有Java语言保证?
正如我在评论中所述,人们可以毫不犹豫地声明DocumentFilter在DocumentListener行为之前肯定会发挥作用。至于同一个听众的倍数 - 你知道的是未定义的。至于多个其他侦听器之间的顺序,您可能需要查看源代码才能找到。请再次告诉我们有关您的限制的详细信息,这是您绝对需要使用多个听众的来源。