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

Posted

技术标签:

【中文标题】如何忽略 Swing 中的按键事件?【英文标题】:How to ignore the key press event in Swing? 【发布时间】:2011-11-29 18:33:37 【问题描述】:

我想让文本字段只接受用户的数字和退格按钮。

我添加了用于检查用户键码的功能,但如果键码不是数字,我不知道如何停止按键事件。

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

 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();并返回;停止事件,但不工作 我诚实的第一反应:为什么似乎没有人记得一个伟大的发明?搜索引擎!毫无疑问,谷歌搜索会给你一个合适的解决方案...... 【参考方案1】:

你不需要弄乱 Swing 事件处理来实现这一点。

最好的方法是改用 JFormattedTextField。

详见 Java 教程:

http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html

【讨论】:

【参考方案2】:

尝试覆盖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:感谢您的提醒。【参考方案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,在这种情况下,格式化文本字段可能更简单,但了解 DocumentFilter 总是很高兴。【参考方案4】:

我建议您查看是否可以使用 keyPressed、KeyReleased 和 KeyTyped 事件,并查看它们是否会阻止密钥到达您的程序。

您的程序可能只寻找一种类型的关键事件,但您需要找出它是哪一种并使用这些事件。

【讨论】:

【参考方案5】:

你可以试试这个:

    private void txtDisplayKeyTyped(java.awt.event.KeyEvent evt)                                           


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

【讨论】:

【参考方案6】:

请参阅Limit TextField input to numeric value - 我认为这正是您正在寻找的。​​p>

我认为您的代码不起作用的原因是 if 语句不正确并且实际上没有捕获非数字键代码。不过,我不确定,因为我自己没有看过或测试过你的代码,所以如果你真的愿意,你可以做一些调试,但老实说,这里发布的解决方案将是最简单的。

【讨论】:

-1,这是非常古老的代码,是为 AWT 而不是 Swing 编写的。 Swing 对此有更好的支持(请参阅此帖子中的其他答案)。该代码也不适用于粘贴的文本。

以上是关于如何忽略 Swing 中的按键事件?的主要内容,如果未能解决你的问题,请参考以下文章

响应 SwiftUI 中的按键事件

如何使用 QxtGlobalShortcut 库检测 Qt 中的按键释放事件

如何在 Qt 应用程序中生成按键事件到系统(win7)(模拟用户在键盘上按键)?

WINFORM中用DSOFramer打开word,如何监听Ctrl+P按键事件?

如何在不使用输入元素的情况下捕获 Vuejs 中的任何按键事件

如何从文本字段中获取值并读取按键事件