Java 我是否需要对addFocusListener方法使用invokeLater()?
我正在浏览大型Java 我是否需要对addFocusListener方法使用invokeLater()?,java,swing,focus,invokelater,Java,Swing,Focus,Invokelater,我正在浏览大型SwingGUI应用程序的源代码。 我注意到当他们想做一些事情以防focusgain(focusevn)或focusLost(focusevn)他们总是使用invokeLater() 例如: yourTextField.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) {
Swing
GUI应用程序的源代码。
我注意到当他们想做一些事情以防focusgain(focusevn)
或focusLost(focusevn)
他们总是使用invokeLater()
例如:
yourTextField.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
yourTextField.selectAll();
}
});
}
});
为什么这里需要调用器?因为焦点是非常异步的,调用器移动代码行xxx.selectAll();到底EDT@mKorbel评论应该是answer@mKorbel谢谢但我不明白什么是焦点是异步的,为什么在这种情况下selectall应该移动到EDT的末尾?焦点基于来自本机操作系统的对等点,然后是繁重的任务,此事件可以在EDT(简单队列)中的任何部分执行,第一个、最后一个、任何,然后selectall()can/can/will将在FocusGain执行到GUI之前执行(在EDT QUE中以非ENCE的方式过期),因为这个JTextField当前没有焦点,也没有活动的插入符号,invokeLater很好地保证了事件被移动到队列的末尾,我建议对文档中的事件使用invokeLaterOracle官方教程中提到了(例如DocumentListener/Filter),focus非常懒惰