如何在Swing中忽略按键事件?

4

我希望将文本框设置为只接受用户输入数字和退格键。

我已经添加了一个函数来检查用户的按键代码,但是我不知道如何停止按键事件,如果按键代码不是数字。

请问我需要在函数中添加什么代码来停止事件?

 private void jTextField2KeyPressed(java.awt.event.KeyEvent evt)   
 {                                       

   if(!((evt.getKeyCode()==8) || (evt.getKeyCode()>48 && evt.getKeyCode()<57)))
   {
      //how to stop the key pressed event
   }
 }

我尝试使用 "evt.consume(); return;" 来停止事件,但不起作用。 - e-qi
我的诚实第一反应是:为什么似乎没有人记得一个伟大的发明?搜索引擎!毫无疑问,谷歌搜索会给你一个合适的解决方案... - Andy
6个回答

8

7
尝试覆盖keyTyped
@Override
public void keyTyped(KeyEvent evt) {
    if (!Character.isDigit(evt.getKeyChar()) && !(evt.getKeyCode() == KeyEvent.VK_BACK_SPACE)) {
        evt.consume();
    }
}

更新:

如果您希望禁止粘贴并强制用户手动输入,可以使用以下方法。

@Override
public void keyPressed(KeyEvent evt) {
    if(evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_V) {
        evt.consume();
    }
}

-1,不要使用KeyEvents。如果将文本粘贴到文本字段中,则无法正常工作。 - camickr
@camickr:谢谢你提醒我。 - Bhesh Gurung

3

将文本字段的PlainDocumentDocumentFilter设置为。

示例:

    PlainDocument document = new PlainDocument();
    document.setDocumentFilter(new DocumentFilter() {

        @Override
        public void insertString(FilterBypass fb, int offset, String text, AttributeSet attrs) throws BadLocationException {
            fb.insertString(offset, filter(text), attrs);
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            fb.replace(offset, length, filter(text), attrs);
        }

        private String filter(String text) {
            StringBuilder builder = new StringBuilder(text);
            for (int i = 0; i < builder.length();) {
                if (Character.isDigit(builder.charAt(i))) {
                    i += 1;
                } else {
                    builder.deleteCharAt(i);
                }
            }
            return builder.toString();
        }
    });

    JTextField field = new JTextField(document, null, 0);

1
+1,在这种情况下,格式化文本字段可能更简单,但了解DocumentFilter总是很好的。 - camickr

0
我建议你看一下是否能够处理keyPressed、KeyReleased和KeyTyped事件,并观察它们是否阻止键盘按键传递给你的程序。
你的程序可能只关注一种类型的键盘事件,但你需要确定是哪一种类型,并消费掉这些事件。

0
你可以试试这个:
    private void txtDisplayKeyTyped(java.awt.event.KeyEvent evt) {                                          


    boolean valid = false; //some condition here
    if(!valid) evt.consume();
}

-2

看看将文本字段输入限制为数字值 - 我认为这正是您要寻找的。

我认为您代码不起作用的原因是if语句不正确,不能真正捕获非数字键码。虽然我不确定,因为我没有看到或测试过您的代码,所以您可以进行一些调试,如果您真的想这样做,但说实话,这里发布的解决方案将是最简单的。


2
-1,那是非常老的代码,是为AWT而非Swing编写的。Swing对此有更好的支持(请参见本帖中的其他答案)。那段代码也无法处理粘贴的文本。 - camickr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接