简体   繁体   English

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

[英]Java Swing JTextArea caret refuses to move to upper left corner

Using the method below, I am trapping the VK_ENTER key event to gather the text in a default JTextArea, process it, and then empty the JTextArea. 使用以下方法,我捕获了VK_ENTER键事件,以将文本收集到默认的JTextArea中,对其进行处理,然后清空JTextArea。 I noticed that the caret did not reset to the upper left but to the first column of the second row instead . 我注意到,插入记号未重置为左上角,而是重置为第二行第一列 No matter what I have tried, I cannot seem to convince the caret to go back to the upper left corner (it's original starting position). 无论我尝试了什么,我似乎都无法说服插入符号返回左上角(它是原始开始位置)。 You can see my attempts to understand where the caret believes that it is. 您可以看到我试图了解插入符号所在的位置。 There is definitely an empty line in place after the Enter key is trapped for the first time. 首次捕获Enter键后,肯定有一个空行。

The reason I use JTextArea is because my text to process may be up to 256 bytes long, so a JTextField is cumbersome. 我使用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();
        }
    }
}

Output of the first use of this method: carat: 0 length: 0 line: 1 首先使用此方法的输出:克拉:0长度:0行:1

Output of the second use of this method: carat: 0 length: 0 line: 1 第二次使用此方法的输出:克拉:0长度:0行:1

...ad infinitum. ...无限

Am I missing something simple here? 我在这里缺少简单的东西吗?

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

public void keyReleased(KeyEvent e) {

Ok, why is this only happening on keyPressed ? 好的, 为什么这只发生在keyPressed I'm not quite sure, but my guess is that the JTextArea first processes the jTextArea2.setCaretPosition(0); 我不太确定,但是我的猜测是JTextArea首先处理jTextArea2.setCaretPosition(0); before it breaks the line (what the enter key naturally does in a TextArea). 在它换行之前(Enter键在TextArea中自然执行的操作)。 This is obviously not the case when keyReleased , then it calls jTextArea2.setCaretPosition(0); 如果keyReleased显然不是这种情况,那么它将调用jTextArea2.setCaretPosition(0); after it breaks the line, and that is what you want. 它打破界限之后,这就是您想要的。

Here is an example: 这是一个例子:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM