java - 打印 JTextField 的内容

标签 java jtextfield

我制作了一个提交按钮,但只有在字段中有文本时才会将其设置为启用。如果字段中没有文本,提交按钮将禁用。 但是,当我输入 a 时,提交按钮不会变为启用状态,并且需要我输入另一个字符才能执行此操作。即使我删除了框中的所有字符,我也必须再次按删除按钮才能禁用该按钮。

我不明白为什么会发生这种情况,我输入了一条打印语句来查看输入字符时会发生什么。我注意到它打印出了我在最后一次按键之前输入的内容。

public void keyPressed(KeyEvent e) {
    System.out.println(inputField.getText()); // test input
    if(inputField.getText().trim().length() == 0) 
        submit.setEnabled(false);

    if(e.getKeyCode() == KeyEvent.VK_ENTER) {
        if(inputField.getText().trim().length() == 0)
             JOptionPane.showMessageDialog(this, "Invalid input.", "Error", JOptionPane.ERROR_MESSAGE);
        else
            displayMessage();
        return;
    } 

    if(inputField.getText().trim().length() > 0) {
        submit.setEnabled(true);
    }
}

最佳答案

使用keyReleased而不是keyPressedkeyTyped。看起来事件在按下键时触发,但在字段更新之前触发。使用 keyTyped,它可以删除字段中当前的字符,但您仍然需要输入 2 个字符才能使按钮再次工作。

import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;


public class TextField extends JFrame {

        JTextArea inputField;
        JButton    submit;

        public TextField()
        {
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                inputField = new JTextArea("hi");
                submit = new JButton("Submit");
                inputField.addKeyListener(new KeyListener() {

                        @Override
                        public void keyPressed(KeyEvent arg0) {
                                //func(arg0);
                        }

                        @Override
                        public void keyReleased(KeyEvent arg0) {
                                func(arg0);
                        }

                        @Override
                        public void keyTyped(KeyEvent arg0) {
                                //func(arg0);
                        }
                });
                this.setLayout(new GridLayout(0,1));
                this.add(inputField);
                this.add(submit);
                this.pack();
                this.setVisible(true);
        }

        void func(KeyEvent arg0)
        {
            System.out.println(inputField.getText() + "length: " + inputField.getText().trim().length()); // test input
            if(inputField.getText().trim().length() == 0)
                submit.setEnabled(false);

            if(arg0.getKeyCode() == KeyEvent.VK_ENTER) {
                if(inputField.getText().trim().length() == 0)
                        System.out.println("error");
                else
                    System.out.println("success");
                return;
            }
            if(inputField.getText().trim().length() > 0) {
                submit.setEnabled(true);
            }
        }

        public static void main(String [] args)
        {
                new TextField();
        }
}

关于java - 打印 JTextField 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927106/

相关文章:

java - 当内容太长时 JTextField 显示 '...'

java - JTextField "Bubble"文本

java - 为什么添加的变量是错误的?

java - client_secret 在 client_secret.json 中不可用

java - GWT 由 Manuel Carrasco 上传 Moñino Issue

java - 如何让 JTextField 响应回车键

java - Eclipse Maven 多模块 checkout

java - Random.nextgaussian() 可以从具有不同均值和标准差的分布中采样值吗?

java - 从 JTextField 创建 'BufferedReader'

java - 从 Java 读取条形码