Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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 当JDialog中的JTextField可见时,将焦点放在JDialog中的JTextField上_Java_Swing_Focus_Jdialog - Fatal编程技术网

Java 当JDialog中的JTextField可见时,将焦点放在JDialog中的JTextField上

Java 当JDialog中的JTextField可见时,将焦点放在JDialog中的JTextField上,java,swing,focus,jdialog,Java,Swing,Focus,Jdialog,我有一个子类JDialog。。。重写的setVisible方法如下所示: public void setVisible( boolean visible ){ super.setVisible( visible ); if( visible ){ inputJTF.requestFocus(); } } 事实上,当我显示JDialog时,焦点在联合特遣部队上。。。但是后者恰好也是JDialog中的“第一”组件(北面板),所以这并不奇怪 但我的测试代码告

我有一个子类JDialog。。。重写的setVisible方法如下所示:

public void setVisible( boolean visible ){
    super.setVisible( visible );

    if( visible ){
        inputJTF.requestFocus();
    }
}
事实上,当我显示JDialog时,焦点在联合特遣部队上。。。但是后者恰好也是JDialog中的“第一”组件(北面板),所以这并不奇怪

但我的测试代码告诉我其他事情:

    EventQueue.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            app.mainFrame.searchDlg.setVisible( true );

            // all 3 of these asserts fail...
            assertTrue( app.mainFrame.searchDlg.inputJTF.hasFocus() );
            Component focusOwner = app.mainFrame.searchDlg.getFocusOwner();
            assertFalse( focusOwner == null );
            assertTrue( String.format( "# focus owner %s", focusOwner.getClass()), focusOwner ==  app.mainFrame.searchDlg.inputJTF );

        }
    });

。。。所以事实上我被告知“焦点所有者”是空的。。。联合特遣部队也没有重点。有人能解释发生了什么吗?

大多数对话框都是模态的,这意味着setVisible(true)语句之后的语句在对话框关闭之前不会执行

默认情况下,焦点将转到对话框上的第一个组件

如果出于某种原因,您需要关注不同的组件,那么请查看一个解决方案,该解决方案允许您控制哪个组件获得关注


此解决方案使用
AncestorListener
在组件显示在可见对话框/框架上时将焦点放在组件上。

大多数对话框都是模态的,这意味着直到对话框关闭后才会执行setVisible(true)语句之后的语句

默认情况下,焦点将转到对话框上的第一个组件

如果出于某种原因,您需要关注不同的组件,那么请查看一个解决方案,该解决方案允许您控制哪个组件获得关注


当组件显示在可见对话框/框架上时,此解决方案使用一个
anstorlistener
将焦点放在组件上。

Aha。。。这是JUnit和JavaGUI中的一个“问题”

我的代码中的测试失败。。。但以下代码没有:

    EventQueue.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            searchDlg.setVisible( true );
            assertTrue( searchDlg.queryString == null );
        }
    });
    Robot robot = new Robot();
    robot.delay( 10 );
    EventQueue.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            // now passes
            assertTrue( app.mainFrame.searchDlg.inputJTF.hasFocus() );
        }
    });
。。。如果
robot.delay()
减少为1或不存在,则会发生故障

显然,这与实现
JDialog
所需的有限时间有关

Rob Camick的回答很有趣,
RequestFocusListener
按预期工作


然而,他的回答实际上并没有回答这个问题:到底发生了什么,为什么这个测试失败了?

啊哈。。。这是JUnit和JavaGUI中的一个“问题”

我的代码中的测试失败。。。但以下代码没有:

    EventQueue.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            searchDlg.setVisible( true );
            assertTrue( searchDlg.queryString == null );
        }
    });
    Robot robot = new Robot();
    robot.delay( 10 );
    EventQueue.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            // now passes
            assertTrue( app.mainFrame.searchDlg.inputJTF.hasFocus() );
        }
    });
。。。如果
robot.delay()
减少为1或不存在,则会发生故障

显然,这与实现
JDialog
所需的有限时间有关

Rob Camick的回答很有趣,
RequestFocusListener
按预期工作


然而,他的回答实际上并没有回答以下问题:到底发生了什么,为什么测试失败?

“setVisible(true)语句之后的语句直到对话框关闭后才会执行”。。。好啊解释了很多,谢谢。您是否知道为什么
getFocusOwner()
会返回
null
?现在检查你的对话焦点…如果可以的话。。。我熟悉setVisible(true)阻塞线程(甚至EDT)。。。我花了很多时间对它(新的“事件调度泵”等)挠头。但是,为什么在我的第二个代码段中,它没有阻止EDT线程呢?
但是为什么在我的第二个代码段中,
-您试图解决的确切问题是什么?你为什么会在意焦点是什么?仅供参考,您不能总是假定所有代码都是按顺序执行的。与使用invokeAndWait(…)的方式相同,其他代码也可以使用invokeLater(),这意味着在执行断言语句时可能无法确定焦点。张贴正确的
SSCCE
,演示问题。代码片段没有帮助,因为我们不了解代码的使用上下文。@MikCorvent,不要忘记单击复选标记“接受”答案,这样人们就知道问题已经解决了。我必须先做一些实验,看看问题是否真的解决了。。。我也在考虑建立一个SSCCE。但是我会在适当的时候将它标记为已解决……”“setVisible(true)语句之后的语句直到对话框关闭后才会执行”。。。好啊解释了很多,谢谢。您是否知道为什么
getFocusOwner()
会返回
null
?现在检查你的对话焦点…如果可以的话。。。我熟悉setVisible(true)阻塞线程(甚至EDT)。。。我花了很多时间对它(新的“事件调度泵”等)挠头。但是,为什么在我的第二个代码段中,它没有阻止EDT线程呢?
但是为什么在我的第二个代码段中,
-您试图解决的确切问题是什么?你为什么会在意焦点是什么?仅供参考,您不能总是假定所有代码都是按顺序执行的。与使用invokeAndWait(…)的方式相同,其他代码也可以使用invokeLater(),这意味着在执行断言语句时可能无法确定焦点。张贴正确的
SSCCE
,演示问题。代码片段没有帮助,因为我们不了解代码的使用上下文。@MikCorvent,不要忘记单击复选标记“接受”答案,这样人们就知道问题已经解决了。我必须先做一些实验,看看问题是否真的解决了。。。我也在考虑建立一个SSCCE。但我会在适当的时候将它标记为已解决。。。