Java Swing JTextArea 插入符号拒绝移动到左上角

Java Swing JTextArea caret refuses to move to upper left corner

使用下面的方法,我捕获 VK_ENTER 键事件以在默认的 JTextArea 中收集文本,处理它,然后清空 JTextArea。我注意到插入符号没有重置到左上角,而是重置到第二行的 第一列 。无论我尝试过什么,我似乎都无法说服插入符号回到左上角(它是原来的起始位置)。您可以看到我试图了解插入符号认为它在哪里。第一次困回车键后肯定有空行

我使用 JTextArea 的原因是因为我要处理的文本可能长达 256 个字节,所以 JTextField 很麻烦。

private void jTextArea2KeyPressed(java.awt.event.KeyEvent evt) {                                      
    if(evt.getKeyCode() == KeyEvent.VK_ENTER){
        try {
            sendCommand("hf", "ab4mw", jTextArea2.getText().trim());
            jTextArea1.append(TX + jTextArea2.getText().trim() + nl);
            jTextArea2.setText("");
            System.out.println("carat: " + jTextArea2.getCaretPosition());
            System.out.println("length: " + jTextArea2.getText().length());
            jTextArea2.setCaretPosition(0);
            //jTextArea2.moveCaretPosition(0);
            System.out.println("line: " + jTextArea2.getLineCount());
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

第一次使用此方法的输出: 克拉:0 长度:0 行:1

第二次使用此方法的输出: 克拉:0 长度:0 行:1

...无穷无尽。

我是不是漏掉了一些简单的东西?

将您的 public void keyPressed(KeyEvent e) { 方法更改为

public void keyReleased(KeyEvent e) {

好的,为什么 这只发生在 keyPressed?我不太确定,但我的猜测是 JTextArea 在它换行之前首先处理 jTextArea2.setCaretPosition(0);(回车键在 TextArea 中的自然作用)。 keyReleased的时候显然不是这样,然后它在断行后调用jTextArea2.setCaretPosition(0);,这就是你想要的。

这是一个例子:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;

public class Example extends JFrame {

    public Example() {

        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2,0));

        JTextArea jTextArea1 = new JTextArea();
        jTextArea1.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    jTextArea1.setText("");
                    System.out.println("carat: "
                            + jTextArea1.getCaretPosition());
                    System.out.println("length: "
                            + jTextArea1.getText().length());
                    jTextArea1.setCaretPosition(0);
                    // jTextArea2.moveCaretPosition(0);
                    System.out.println("line: " + jTextArea1.getLineCount());
                }
            }
        });
        jTextArea1.setBorder(new LineBorder(Color.BLACK));
        jTextArea1.setText("This TextArea will not work like you want it to");

        JTextArea jTextArea2 = new JTextArea();
        jTextArea2.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    jTextArea2.setText("");
                    System.out.println("carat: "
                            + jTextArea2.getCaretPosition());
                    System.out.println("length: "
                            + jTextArea2.getText().length());
                    jTextArea2.setCaretPosition(0);
                    // jTextArea2.moveCaretPosition(0);
                    System.out.println("line: " + jTextArea2.getLineCount());
                }
            }
        });
        jTextArea2.setBorder(new LineBorder(Color.BLACK));
        jTextArea2.setText("This TextArea WILL");

        frame.add(jTextArea1);
        frame.add(jTextArea2);
        frame.setSize(500, 500);
        frame.setVisible(true);

    }

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