Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否需要对addFocusListener方法使用invokeLater()?_Java_Swing_Focus_Invokelater - Fatal编程技术网

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非常懒惰