如何操作粘贴到 JTextField 中但不输入的文本?

How to manipulate text pasted into a JTextField, but not typed input?

我的应用程序提供了将文本从 JTextArea 复制到 JTextField 的可能性(用作 JComboBox 的编辑器组件,但我认为这无关紧要)和如果布尔条件为 true(例如,选中复选框),我想提供删除前导和尾随空格的功能。在 JTextField 中输入前导和尾随空格应该仍然是可能的,只有粘贴的文本应该按照描述进行操作。

我添加了一个 DocumentFilter,但它对键入的更改和粘贴的更改都有响应,而且我在其方法参数中找不到任何条件可以区分键入的插入和粘贴的插入。 KeyListener 不响应粘贴的更改。

I don't find any condition in its method arguments which allow to distinguish typed from pasted insertions. A KeyListener doesn't respond to pasted changes.

侦听器不提供直接方法来确定输入是否来自粘贴操作。但我有一个可能有效的简单解决方案。

  1. 使用 DocumentListener 检测 JTextField 中的文本更改。如果检测到更改,请继续下一步。

  2. Clipboard 对象中获取字符串文本。

  3. 比较 JTextField 中的文本和 Clipboard 中的文本。如果字符串相同,我们假设发生了粘贴。


如果用户在文本字段中的现有文本之间粘贴一些文本,您可以获得插入符位置并从插入符位置开始比较字符串。


更新:

从剪贴板读取:

import java.awt.Toolkit;
import java.awt.datatransfer.*;

Clipboard cb=Toolkit.getDefaultToolkit().getSystemClipboard();
System.out.println(cb.getData(DataFlavor.stringFlavor));

I added a DocumentFilter, but it responds to both typed changes and pasted changes and I don't find any condition in its method arguments which allow to distinguish typed from pasted insertions

我从未尝试过,但也许您可以使用 EventQueue class。具体来说,您可以使用 getCurrentEvent() 方法。

我猜如果事件类型是 keyTyped 那么它是通过在文本字段中输入而生成的。

如果粘贴是使用键盘 CTRL_V 完成的,或者如果您单击执行粘贴的菜单项,则会生成其他事件。

所以我猜你只需要检查事件是否不是 "KeyTyped" 事件并调用你的自定义粘贴逻辑。