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();
}
}
使用下面的方法,我捕获 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();
}
}