【问题标题】:How To Enabling Copy and Cut Operations on Java Disabled Field如何在 Java 禁用字段上启用复制和剪切操作
【发布时间】: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


【解决方案1】:

但这些填充和计算只有在启用输入字段的情况下才应该执行

为什么会有这样的问题?

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

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

我不知道为什么这是一项巨大的努力。

来自组件的事件是如何被捕获和分派的?

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

【讨论】:

  • 感谢您回答我的问题,因为应用程序很大,并且由不同的开发人员维护,并且侦听器不是普通侦听器,不同的输入字段具有不同的侦听器以及侦听器添加到的位置/时间组件也取决于要求。现在我正在处理 Event Queue 和 EventQueueDelegate 但面临一些其他问题。你有关于这些 java 事件处理的示例代码或文档吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 2013-07-16
  • 2015-01-08
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多