首页 > 解决方案 > 使用 getText 输出文本,但在控制台输出时缺少最后一个字符

问题描述

我正在尝试从 a 获取输入JTextField并使用getText(). 它似乎正在工作,只是它没有打印出最后一个字符。如果我输入Hello输出将是Hell,如果我输入Hello there输出将是Hell ther....缺少最后一个字符。

public class Generator {

    private JFrame frame;
    private JTextField textRoomName;
    private String roomName;
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Generator window = new Generator();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Generator() {
        initialize();
        
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.GRAY);
        frame.setForeground(Color.BLACK);
        frame.setBackground(Color.BLACK);
        frame.setBounds(100, 100, 450, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        
        textRoomName = new JTextField();
        textRoomName.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                roomName = textRoomName.getText();
                
            }
        });
        textRoomName.setBounds(140, 52, 212, 20);
        frame.getContentPane().add(textRoomName);
        textRoomName.setColumns(10);
        
        JButton btnGenerate = new JButton("Generate");
        btnGenerate.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println(roomName);
            }
        });
        btnGenerate.setBounds(324, 427, 89, 23);
        frame.getContentPane().add(btnGenerate);
    }
}

标签: javaswingcharacterjtextfieldkeylistener

解决方案


textRoomName.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        roomName = textRoomName.getText();
        
    }
});

不要使用 KeyListener。生成 keyPressed 事件时,文档尚未使用文本更新。

相反,更好的 API 是DocumentListener.

阅读 Swing 教程中的以下部分:

  1. 监听文档的变化
  2. 如何编写一个 DocumentListener

了解更多信息和示例。


推荐阅读