Java 如何使用KeyEvent仅允许JTextField中的数字?

Java 如何使用KeyEvent仅允许JTextField中的数字?,java,swing,formatting,textfield,keyevent,Java,Swing,Formatting,Textfield,Keyevent,我的尝试是: private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) { char c = evt.getKeyChar(); if(c != '1' && c != '2' && c != '3' && c != '4' &&

我的尝试是:

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       
        char c = evt.getKeyChar();

        if(c != '1' && c != '2' && c != '3' && c != '4' 
           && c != '5' && c != '6' && c != '7' && c != '8'
           && c != '9' && c != '0') {
            evt.consume(); 
        } 
这很奇怪,因为这是我的书给我看的


此外,与格式化文本字段相比,这是否可行?

尝试将
如果(测试英里数)
替换为:

    if(c < '0' || c > '9')
        evt.consume();

尝试将您的
if(测试英里数)
替换为:

    if(c < '0' || c > '9')
        evt.consume();

如果希望backspace和delete按钮正常工作,则需要将它们放在If语句中

示例:

if(c != '1' && c != '2' && c != '3' && c != '4' 
               && c != '5' && c != '6' && c != '7' && c != '8'
               && c != '9' && c != '0') || !(c == KeyEvent.VK_BACK_SPACE) ||
               !(c == KeyEvent.VK_DELETE)){
                evt.consume(); 
            } 

如果希望backspace和delete按钮正常工作,则需要将它们放在If语句中

示例:

if(c != '1' && c != '2' && c != '3' && c != '4' 
               && c != '5' && c != '6' && c != '7' && c != '8'
               && c != '9' && c != '0') || !(c == KeyEvent.VK_BACK_SPACE) ||
               !(c == KeyEvent.VK_DELETE)){
                evt.consume(); 
            } 

决不能将
keylister
s与文本组件一起使用

首先,它没有考虑当用户将文本粘贴到字段中时会发生什么。关键事件也有可能被消耗掉,永远无法到达您的侦听器

Swing有许多组件可以满足您的需要

这两种方法都能够将用户输入限制在数字上,我就是
JSpinner
,数字范围的例子

这些字段是后处理字段,也就是说,它们将允许用户输入他们想要的内容,但在失去焦点或用户接受该值时将验证该值


如果您想要实时过滤,您应该使用一个,对于,您不应该将
keylister
s与文本组件一起使用

首先,它没有考虑当用户将文本粘贴到字段中时会发生什么。关键事件也有可能被消耗掉,永远无法到达您的侦听器

Swing有许多组件可以满足您的需要

这两种方法都能够将用户输入限制在数字上,我就是
JSpinner
,数字范围的例子

这些字段是后处理字段,也就是说,它们将允许用户输入他们想要的内容,但在失去焦点或用户接受该值时将验证该值


如果你想要实时过滤,你应该使用一个,因为我有点困惑,为什么这样可以解决我的问题;你能解释一下吗?@Eypros不。如果我们这样做,那么0和9将被消耗,而不是被执行。@user3758041
char
s被美化(和无符号)
short
s。你可以加,除,模,等等。。。它们与任何其他基元数字类型一样。这包括将它们与操作员进行比较。如果您希望完整的字符列表按顺序排列,则为1。只使用
Character.isDigit(c)
而不是手动检查可能更具可读性。如果试图在一条
If
语句中显式进行10次测试,您肯定会犯错误/打字错误。越短越好。通过这样清理代码,您可以使代码更具可读性,在这种情况下,速度更快;你能解释一下吗?@Eypros不。如果我们这样做,那么0和9将被消耗,而不是被执行。@user3758041
char
s被美化(和无符号)
short
s。你可以加,除,模,等等。。。它们与任何其他基元数字类型一样。这包括将它们与操作员进行比较。如果您希望完整的字符列表按顺序排列,则为1。只使用
Character.isDigit(c)
而不是手动检查可能更具可读性。如果试图在一条
If
语句中显式进行10次测试,您肯定会犯错误/打字错误。越短越好。通过这样清理代码,您可以使代码更具可读性,在这种情况下,速度更快。您当前从上述代码得到的结果是什么?它是word吗?好吧,即使这是固定的,除了不允许backspace和delete按钮发挥作用外,它也不会做任何事情。不要使用keyEvents,它们的级别太低,验证不安全(f.i无法处理粘贴的代码)。相反,使用DocumentFilter或JFormattedTextField上述代码的当前结果是什么?它是word吗?好吧,即使这是固定的,除了不允许backspace和delete按钮发挥作用外,它也不会做任何事情。不要使用keyEvents,它们的级别太低,验证不安全(f.i无法处理粘贴的代码)。相反,请使用DocumentFilter或JFormattedTextField