我想模拟JTextArea上的按键。我会使用机器人类,但是我想输入的窗口没有焦点。所以我有一个这样的场景:
public class Test {
public static void main(String[] args) {
Frame frame = new Frame();
JTextArea text = new JTextArea();
frame.add(text);
frame.pack();
frame.setVisible(true);
text.dispatchEvent(new KeyEvent(text,
KeyEvent.KEY_TYPED, 0,
0,
KeyEvent.VK_UNDEFINED, 'H'));
text.dispatchEvent(new KeyEvent(text,
KeyEvent.KEY_TYPED, 0,
0,
KeyEvent.VK_UNDEFINED, 'L'));
}
}
但是在输入H之后,插入符号没有向右移动,这导致L在H之前被键入:区域中的最后文本是LH,但我希望它是HL。
我可以在H和L之间分派一个新的键事件,该事件将向右移动插入符号(右箭头)或调用setCaretPosition,但我正在寻找一个解决方案,该解决方案不会手动移动插入符号,行为就像输入的人(我正在为测试来自学生的作业做测试人员)。
有什么想法吗?
发布于 2015-05-11 07:28:10
Steve更改默认插入符号的解决方案运行良好,但还有另一种解决方案,即执行主线程中的所有键按,如下所示:
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
// dispatch the event now
text.dispatchEvent(new KeyEvent(text, KeyEvent.KEY_TYPED, 0, 0, KeyEvent.VK_UNDEFINED, 'H'));
}
});
似乎在主线程中分派KeyEvents时,它们会自动移动插入符号。对我来说这似乎是最好的解决方案。
发布于 2015-05-08 01:16:44
自定义插入符以始终更新其位置。
final DefaultCaret caret = new DefaultCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
text.setCaret(caret);
来自DefaultCaret JavaDoc
允许使用下列更新策略: NEVER_UPDATE:插入符号保持在文档中相同的绝对位置,而不考虑任何文档更新,除非由于删除而使文档长度小于当前插入符号位置。在这种情况下,插入符号的位置将调整到文档的末尾。在使用此策略时,插入符号不试图通过滚动关联视图来保持自身可见。 ALWAYS_UPDATE:插入符号总是跟踪文档更改。对于常规的更改,如果插入发生在当前位置之前或在当前位置,则增加其位置;如果删除发生在当前位置之前,则减小位置。对于撤消/重做更新,它总是移动到发生更新的位置。插入符号还试图通过调用adjustVisibility方法来保持自身可见。 UPDATE_WHEN_ON_EDT:如果在事件调度线程上执行文档更新,则执行类似于ALWAYS_UPDATE的操作;如果在其他线程上执行更新,则类似于NEVER_UPDATE。 默认属性值为UPDATE_WHEN_ON_EDT。
https://stackoverflow.com/questions/30119201
复制相似问题