【问题标题】:How to stop key repeat on continuous keypress?如何在连续按键时停止按键重复?
【发布时间】:2016-05-08 17:30:31
【问题描述】:

例如,如果我按下“1”键几秒钟,我的JTextArea 中的结果将是“1111111111111”。

有没有办法在一个字符后停止它?

【问题讨论】:

  • 是的,但是如果有人想按住键怎么办?您将打破某些既定的用户体验期望。为什么需要这种方法?你想解决什么问题?
  • 我有一个计算器,完全不需要这个功能。
  • 让用户决定如何将数据输入到文本区域。以这个评论框为例。按住 111111111111111 对我来说毫无意义,但评论框允许。不要担心这样的小事。 (1-)。
  • 那么您确定TextArea 是收集输入的适当方式吗?例如,考虑JTextArea 文档A JTextArea is a multi-line area that displays plain text.。如果您查看JTextField limiting character amount input and accepting numeric only,您会看到可能是更好的方法。您正在使用 JTextArea 锁定特定(可能不正确)的方法。
  • 它是为残疾人准备的,所以它并不重要

标签: java swing keypress jtextarea


【解决方案1】:

如果我对问题的理解正确,您可以为此使用DocumentFilter,并且仅在假设按键延迟超过 0.5 秒时才允许插入文本。

例子:

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class Example {

    public Example() {
        JTextArea textArea = new JTextArea();
        ((AbstractDocument) textArea.getDocument()).setDocumentFilter(new DocumentFilter() {
            String lastStr = "";
            long time = System.currentTimeMillis();

            @Override
            public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attr)
                    throws BadLocationException {
                long delay = System.currentTimeMillis() - time;
                time = System.currentTimeMillis();
                if (str.equals(lastStr) && delay <= 500) {
                    return;
                }
                lastStr = str;
                super.replace(fb, offset, length, str, attr);
            }
        });

        JFrame frame = new JFrame();
        frame.setContentPane(textArea);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Example();
    }
}

【讨论】:

    【解决方案2】:

    有一个容器,(HashSet,ArrayList,任何你喜欢的东西),并且有看起来类似于这个伪代码的方法,用于按键/释放

    add:
        if(!list.contains("key to enter")) addKey();
    
    remove:
        if(list.contains("key to remove")) removeKey();
    

    然后在方法结束时,使用列表中的数据更新文本区域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-21
      • 2022-11-21
      • 2012-05-31
      • 2018-07-25
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多