输入不正确的字符时,无法清除文本字段

时间:2019-10-25 19:32:51

标签: java swing keylistener

我试图在按键上从JTextField检索值,如果值是整数则执行某些操作,如果值不是整数则清除字段。每次尝试检索值时,我都会得到在此之前输入的值(如果输入12则返回1,如果输入123则返回12),当我尝试清除无效字符的字段时,除了无效字符被清除了吗?

public void setUpListeners()
{
    JTextField jT [] = myV.getTextFields();

    jT[0].addKeyListener(new KeyAdapter(){ 
        public void keyTyped(KeyEvent e){
            int id = e.getID();

            if (id == KeyEvent.KEY_TYPED) 
            {
                char c = e.getKeyChar();
                try
                {
                    //check if chars entered are numbers
                    int temp = Integer.parseInt(String.valueOf(c));
                    String tempS = jT[0].getText();
                    System.out.println(tempS);
                }
                catch(Exception ex)
                {
                    jT[0].setText("");
                    System.out.println("Not an integer");

                }
            }
        }
   });
 }

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

public static boolean validateNumber(char num){
    return (num >= '0' && num <='9');
}

然后使用参数KeyEvent“ e”:

if(!validateNumber(e.getKeyChar()))
    e.consume();

而不是使用

public void keyTyped(KeyEvent e){

使用

public void keyReleased(KeyEvent e){

我想您会得到您所需要的,希望我对您有所帮助;)

答案 1 :(得分:0)

Swing 组件使用 Model-View-Controller (MVC)[软件]设计模式/体系结构。 模型保存数据。对于JTextField,数据是它显示的文本。 JTextField的默认模型是PlainDocument,但是JTextField代码实际上是指Document实现的PlainDocument接口。

查看类getText()中的方法JTextComponent的代码(它是JTextField的超类),您将看到它从Document中检索文本。

JTextField中键入键时,字符将传递到Document。看来您的keyTyped()方法在输入的字符到达Document之前调用,因此,当您在getText()方法中调用keyTyped()时,那么除了最后输入的字符外,您还能获得所有文本。

这是不使用KeyListener来验证输入到JTextField中的文本的原因之一。 tenorsax 在他对您的问题的评论中提供了指向该问题的链接,详细说明了正确的方法。

除了DocumentFilterJFormattedTextField(甚至是InputVerifier)之外,您还可以addActionListenerJTextFieldJTextField中按 Enter 。您将找到许多有关如何实现上述每个选项的在线示例,包括 tenorsax 注释中提供的链接。