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



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

我使用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();
    }
}

最新更新