【问题标题】:Dispatching key events on JTextArea doesn't move the caret在 JTextArea 上调度关键事件不会移动插入符号
【发布时间】:2015-07-19 02:18:53
【问题描述】:

我想模拟 JTextArea 上的按键。我会使用 Robot 类,但我想输入的窗口没有焦点。所以我有这样一个场景:

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 并且这会起作用,但我正在寻找一种不会手动移动插入符号的解决方案并且行为就像一个人打字(我正在制作一个测试器来测试学生的作业)。

有什么想法吗?

【问题讨论】:

    标签: java swing simulation jtextarea


    【解决方案1】:

    自定义插入符号以始终更新其位置。

    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。

    【讨论】:

      【解决方案2】:

      史蒂夫更改默认插入符号的解决方案效果很好,但还有另一种解决方案,那就是在主线程中执行所有按键,如下所示:

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

      似乎在主线程中调度 KeyEvent 时,它们会自动移动插入符号。 到目前为止,这对我来说似乎是最好的解决方案。

      【讨论】:

      • 这就是UPDATE_WHEN_ON_EDT更新策略的效果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2016-09-18
      相关资源
      最近更新 更多