有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何操作粘贴到JTextField中的文本,而不是键入的输入?

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

我添加了一个DocumentFilter,但它同时响应类型化更改和粘贴的更改,并且我在其方法参数中找不到任何允许区分类型化插入和粘贴插入的条件。AKeyListener不响应粘贴的更改


共 (2) 个答案

  1. # 1 楼答案

    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));
    
  2. # 2 楼答案

    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类。具体来说,您可能可以使用getCurrentEvent()方法

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

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

    所以我猜您只需要检查事件是否为“KeyTyped”事件,并调用自定义粘贴逻辑