【问题标题】:Having trouble clearing a text field when an improper character is entered输入不正确的字符时无法清除文本字段
【发布时间】:2019-10-25 19:32:51
【问题描述】:

我正在尝试从按键上的 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");

                }
            }
        }
   });
 }

【问题讨论】:

  • 不要使用KeyListener,请参阅Restricting JTextField input to Integers 以获得更好的实现,使用DocumentFilter.JFormattedTextField
  • 不要使用文本字段。 new JSpinner(new SpinnerNumberModel(5,0,100,1)); 对最终用户更友好。

标签: java swing keylistener


【解决方案1】:

您可以执行以下操作:

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){

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

【讨论】:

  • 感谢您的回答,它现在非常适合无效字符,但是当我输入有效数字时,我仍然遇到滞后的问题?
  • 我得到:java.lang.NumberFormatException:对于输入字符串:“”作为我的第一个字符,即使它是一个数字,我也不知道为什么。
  • 在我看来,您收到的异常是您输入为空“”的值,但使用 keyreleased 它应该是固定的
  • 啊,我明白为什么了,现在非常感谢您的回复!
【解决方案2】:

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

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

当您在JTextField 中键入一个键时,该字符将传递给Document。您的keyTyped() 方法似乎在您键入的字符到达Document 之前被调用,因此当您在keyTyped() 方法中调用getText() 时,您将获得所有文本除了您输入的最后一个字符。

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

除了DocumentFilterJFormattedTextField(甚至InputVerifier),您还可以将addActionListener 转换为JTextField,当您在@ 中按Enter 时将执行该操作987654345@。您将找到许多在线示例,说明如何实现这些选项中的每一个,包括 tenorsax 评论中提供的链接。

【讨论】:

  • 非常感谢,这正是我想要帮助我理解的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多