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

时间:2015-08-21 20:08:09

标签: 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 line:1

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

... ad infinitum。

我在这里错过了一些简单的东西吗?

1 个答案:

答案 0 :(得分:2)

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