Java swing requestFocusInWindow()

时间:2017-06-19 23:10:41

标签: java swing autocomplete focus jtextfield

我知道关于如何专注于某个文本字段等问题有很多问题,但似乎我面临的问题有点不同。所以,我有一个JTextField,它具有自动填充文本的功能,如果用户之前输入了当前的文本。我还有一组按钮,按下时会在文本字段中插入一些预定义的文本部分。问题是每次在文本字段中出现任何新文本时,自动完成都可以触发并附加用户先前使用的文本。为了更友好,我决定选择自动完成附加的部分。所有代码都在ED线程中执行。考虑文本字段不在焦点的情况:

两个代码示例都在按钮的actionPerformed方法中。

// does not work if (textField.requestFocusInWindow()) { textField.getDocument().insertString(...); }

insertString()被覆盖并具有通过自动完成选择附加字符串的所有逻辑。所以,我唯一需要的是在插入字符串之前选择文本字段。

我试过了:

// does work textField.requestFocusInWindow(); SwingUtilities.invokeLater(() -> { textField.getDocument().insertString(...); });

官方文件说:

  

对requestFocusInWindow方法的调用会启动焦点转移,但它不会立即移动焦点...

这是有道理的,因为要获得焦点,必须对客户端操作系统的窗口管理器进行调用(这是我如何理解的,如果我错了就纠正我)。

第二个示例是否正常工作主要是因为两个事件(获得焦点和插入字符串)都被添加到事件队列中并且插入出现在焦点请求之后(实际上在队列末尾)或者我错过了什么?这是有效的解决方案吗?可以做得更好吗?

注意:简单地在文本字段中添加一个监听器(在焦点处时做出反应)不是解决方案,因为我在这里描述的逻辑只是所用功能的一部分。

0 个答案:

没有答案