【发布时间】:2018-11-12 08:08:06
【问题描述】:
我正在开发一个软件,客户端请求所有禁用的文本字段都应该被允许进行文本选择、剪切和复制操作。但由于面临一些问题,现在无法继续。符合要求的输入字段应该是只读文本字段,可以通过 ctrl+c 进行文本选择和复制/剪切,并且在单击文本字段时不应触发任何焦点/动作侦听器。
以前所有禁用的组件都通过
禁用component.setEnabled(boolean)
但是这样一来,所有禁用的字段都不能进行文本选择、剪切和复制操作。我尝试了几种方法来启用复制和剪切操作,但发现组件在此状态下没有处理任何关键事件,它似乎与 Component.enableEvents(long) 有关我怀疑这种方法将允许将 KeyEvent 分派给组件的容器,但我的项目无法访问此方法。
所以我把所有的组件都改成使用了
JComponent.setEditable(boolean)
但是这种方法的问题是,所有禁用的组件都会触发FocusListener,这不应该发生,因为所有禁用的字段都应该是只读的并且为零对其他现有领域的影响。有没有一种方法可以在不触发 FocusListener 的情况下使用 setEditable 或其他更简单的方法来启用剪切和复制操作?
(任何人都可以帮助解释来自组件的事件是如何被捕获和分派的?包括当 keyEvent 应该/不应该分派给子组件时 java 如何进行检查,有没有办法可以绕过那些检查并允许组件在字段被禁用时处理KeyEvent)。
【问题讨论】:
-
为什么焦点事件有问题?
-
@MauricePerry,因为我不希望在用户选择要复制的文本时触发焦点事件,一些焦点事件是执行数据填充/计算,但这些填充和计算应该只做如果输入字段已启用(并且在处理焦点事件之前更改所有焦点侦听器以检查字段 isEditable 是巨大的努力)
标签: java swing keyevent disabled-input