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

标签 java swing focus jdialog

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

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

    if( visible ){
        inputJTF.requestFocus();
    }
}

事实上,当我显示 JDialog 时,焦点位于 JTF 上...但后者恰好也是 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) 语句之后的语句只有在对话框关闭后才会执行。

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

如果由于某种原因您需要关注不同的组件,请查看 Dialog Focus获取允许您控制哪个组件获得焦点的解决方案。

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

关于java - 当 JDialog 中的 JTextField 可见时,将焦点放在 JTextField 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37057002/

相关文章:

java - 无法卸载Java

javascript - focus() 在 Safari 或 chrome 中不起作用

Java方法定义问题

java - 为什么指定的对象有资格进行垃圾回收?

java - 更改 BTM tlog 文件位置

java - 更改选项卡式面板的背景颜色

Java从csv读取并显示在jTable上

java - 类似于 Windows 中的日期时间选择器

wpf - 如果 ListBox 使用数据绑定(bind),如何在加载时正确设置焦点?

c++ - 我的应用程序窃取焦点