2016-05-08 68 views
-1

例如,如果我按下键“1”几秒钟,我的JTextArea中的结果将为“1111111111111”。如何在连续按键时停止按键重复?

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

+3

肯定的,但如果有人想按住键?你将打破某些确定的用户体验期望。你为什么需要这种方法?你想解决什么问题? – KevinO

+0

我有一个计算器,我根本不需要这个功能。 –

+3

让用户决定如何将数据输入到文本区域。以此评论框为例。对我来说,按住111111111111111是没有意义的,但评论框允许。不要担心这样的小事。 (1-)。 – camickr

回答

2

如果我正确地理解了这个问题,您可以使用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(); 
    } 
} 
0

有一个容器,(HashSet的,ArrayList中,不管你喜欢),并有期待类似这样的伪代码按键方法/释放

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

remove: 
    if(list.contains("key to remove")) removeKey(); 
在你的方法结束

然后,更新文本区域与列表中的数据。