使用下面的方法,我捕获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。
我在这里错过了一些简单的东西吗?
答案 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();
}
}