Search code examples
javaswingjtextfieldkeylistener

(Java Swing) JTextField updates "too late"


This is a code sample from a feet<->meters converter. My problem: It doesn't update the current input, for example: If the text in the JTextField is "50", the textField.getText()only gives the String "5", so the double result would be 5.0. As a consequence, a "5" in the JTextField gives an error in double result = Double.parseDouble(textField.getText()); "Empty String". Thanks in advance for your answers!

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);
                }
            }
        }
    });
}

Note: Ofcourse an else is missing if the KeyEvent isnt valid, but I didn't want to continue coding before this error isn't fixed.


Solution

  • You are using the wrong event, try keyReleased instead. Also fixed the string comparison

        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);
                    }
                }
            }
        });