如何在 Java 禁用字段上启用复制和剪切操作

How To Enabling Copy and Cut Operations on Java Disabled Field

我正在开发一个软件,客户端请求所有禁用的文本字段都应该被允许进行文本选择、剪切和复制操作。但现在由于面临一些问题而无法继续。符合要求的输入字段应该是一个只读的文本字段,能够通过 ctrl+c 进行文本选择和 copy/cut,并且当单击文本字段时它不应触发任何 Focus/Action 侦听器。

之前所有被禁用的组件都是通过

禁用的

component.setEnabled(boolean)

但这样一来,所有禁用的字段都无法进行文本选择、剪切和复制操作。我尝试了几种方法来启用复制和剪切操作,但发现该组件在此状态下未处理任何关键事件,它似乎与 Component.enableEvents(long) I怀疑此方法将允许容器将 KeyEvent 分派给组件,但我的项目无法访问此方法。

所以我更改了所有组件以使用

JComponent.setEditable(boolean)

但是这个方法的问题是,所有被禁用的组件都会触发FocusListener,这不应该发生,因为所有被禁用的字段应该是只读的并且对其他现有字段的影响为零。有没有一种方法可以启用剪切和复制操作,而无需使用 setEditable 触发 FocusListener ] 或者还有其他更简单的方法?

(任何人都可以帮助解释如何捕获和分发来自组件的事件?包括当 keyEvent should/should 未分发到时 java 如何进行检查子组件,有没有一种方法可以绕过这些检查并允许组件在禁用该字段时处理 KeyEvent)。

but these population and computation should do only if the input field is enabled

为什么这是个问题?

如果您使用所有组件共享的公共侦听器,那么您只需添加一个检查以查看该组件是否可编辑。

如果您为每个组件使用单独的侦听器,那么如果组件不可编辑,则不会向该组件添加侦听器。

我不明白为什么这是一项巨大的努力。

how the event from the component is caught and dispatch?

您或许可以使用自定义 KeyboardFocusManager。也许重写 dispatchEvent(...) 方法以防止在您的特定情况下调度事件。