【问题标题】:(Java Swing) JTextField updates "too late"(Java Swing) JTextField 更新“为时已晚”
【发布时间】:2015-08-15 12:08:07
【问题描述】:

这是一个英尺米转换器的代码示例。我的问题:它不会更新当前输入,例如:如果 JTextField 中的文本是“50”,textField.getText() 只给出字符串“5”,所以double result 将是 5.0。因此,JTextField 中的“5”在double result = Double.parseDouble(textField.getText());“空字符串”中给出错误。提前感谢您的回答!

public static void addKL(JTextField textField, JTextField textField2, String name) {

    textField.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent evt) {
            if(evt.getKeyCode() == KeyEvent.VK_1||evt.getKeyCode() == KeyEvent.VK_2||evt.getKeyCode() == KeyEvent.VK_3||evt.getKeyCode() == KeyEvent.VK_4||evt.getKeyCode() == KeyEvent.VK_5||evt.getKeyCode() == KeyEvent.VK_6||evt.getKeyCode() == KeyEvent.VK_7||evt.getKeyCode() == KeyEvent.VK_9||evt.getKeyCode() == KeyEvent.VK_COLON||evt.getKeyCode() == KeyEvent.VK_BACK_SPACE                           ) {
                double result = Double.parseDouble(textField.getText());
                if(name=="ftFIELD") {
                    textField2.setText("" + result/3.2808);
                }
                else if(name=="mFIELD") {
                    textField2.setText("" + result*3.2808);
                }
            }
        }
    });
}

注意:如果 KeyEvent 无效,当然会丢失 else,但我不想在未修复此错误之前继续编码。

【问题讨论】:

  • name=="ftFIELD" 在比较 String 对象时使用equals 方法。
  • 该方法永远不会进入[if-else statements](也检查一下试试 System.out.println("I enter here"))如果它没有进入(我很高兴它会不)你必须在 java 中使用 name.equals("ftFIELD") == 不像 int [[C]]
  • 每次输入数字时都会调用keylistener。因此,您需要继续阅读该字段,每次按下某个键时更新另一个字段。

标签: java swing jtextfield keylistener


【解决方案1】:

您使用了错误的事件,请改用keyReleased。还修复了字符串比较

    text.addKeyListener(new KeyAdapter() {
        public void keyReleased(KeyEvent evt) {
            if(evt.getKeyCode() == KeyEvent.VK_1||evt.getKeyCode() == KeyEvent.VK_2||evt.getKeyCode() == KeyEvent.VK_3||evt.getKeyCode() == KeyEvent.VK_4||evt.getKeyCode() == KeyEvent.VK_5||evt.getKeyCode() == KeyEvent.VK_6||evt.getKeyCode() == KeyEvent.VK_7||evt.getKeyCode() == KeyEvent.VK_9||evt.getKeyCode() == KeyEvent.VK_COLON||evt.getKeyCode() == KeyEvent.VK_BACK_SPACE                           ) {
                double result = Double.parseDouble(text.getText());

                if("ftFIELD".equals(name)) {
                    textField2.setText("" + result/3.2808);
                }
                else if("mFIELD".equals(name)) {
                    textField2.setText("" + result*3.2808);
                }
            }
        }
    });

【讨论】:

  • KeyListener 是监视任何文本字段更改的糟糕选择,它们通知侦听器的顺序未定义(因此它们可以在您的侦听器之前消费关键事件),没有考虑将文本粘贴到字段中时会发生什么并可能导致突变异常
【解决方案2】:

不要将KeyListener 与文本组件一起使用,用户可能会将文本粘贴到您的听众不会拾取的字段中。

相反,如果您想知道该字段何时被修改,您应该使用DocumentListener。更多详情请见Listening for Changes on a Document

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2013-04-29
    • 2013-04-19
    相关资源
    最近更新 更多