我知道关于如何专注于某个文本字段等问题有很多问题,但似乎我面临的问题有点不同。所以,我有一个JTextField
,它具有自动填充文本的功能,如果用户之前输入了当前的文本。我还有一组按钮,按下时会在文本字段中插入一些预定义的文本部分。问题是每次在文本字段中出现任何新文本时,自动完成都可以触发并附加用户先前使用的文本。为了更友好,我决定选择自动完成附加的部分。所有代码都在ED线程中执行。考虑文本字段不在焦点的情况:
两个代码示例都在按钮的actionPerformed
方法中。
// does not work
if (textField.requestFocusInWindow()) {
textField.getDocument().insertString(...);
}
insertString()
被覆盖并具有通过自动完成选择附加字符串的所有逻辑。所以,我唯一需要的是在插入字符串之前选择文本字段。
我试过了:
// does work
textField.requestFocusInWindow();
SwingUtilities.invokeLater(() -> {
textField.getDocument().insertString(...);
});
官方文件说:
对requestFocusInWindow方法的调用会启动焦点转移,但它不会立即移动焦点...
这是有道理的,因为要获得焦点,必须对客户端操作系统的窗口管理器进行调用(这是我如何理解的,如果我错了就纠正我)。
第二个示例是否正常工作主要是因为两个事件(获得焦点和插入字符串)都被添加到事件队列中并且插入出现在焦点请求之后(实际上在队列末尾)或者我错过了什么?这是有效的解决方案吗?可以做得更好吗?
注意:简单地在文本字段中添加一个监听器(在焦点处时做出反应)不是解决方案,因为我在这里描述的逻辑只是所用功能的一部分。