java - 模态无父 JDialog 不抢焦点

标签 java swing

我们有一个应用程序,作为它的第一个 UI 操作,它显示一个没有父框架的模态 JDialog。

public LoginDialog(Frame owner, Config config, Object... params) {
    super((Frame)null, true);

不幸的是,它有一个讨厌的特性,即当它出现时,虽然它出现在前面,但它并没有捕获焦点。

因此,用户在通过双击开始菜单启动应用程序后,必须使用鼠标选择“登录”对话框并输入信息。

有没有什么办法可以让这个JDialog出现在最前面的时候抢到焦点?

我已经尝试在调用 setVisible(true) 之前、之后和通过 invokeLater 调用“requestFocus”——但这些似乎都没有任何效果。

我们如何让模态对话框捕获焦点?

更新:问题在于用于尝试呈现背景“等待窗口”的代码。这个窗口显示在登录对话框的“后面”作为一个 hack,这样当对话框消失时,用户会看到“请稍候”消息。因为它是应用程序创建的第一个窗口,所以它获得了焦点。我不确定是否有办法使用此 hack 使对话框在事件分派(dispatch)线程内再次获得焦点 - 但我通过取消 hacking 并正确地做事来修复它。

最佳答案

首先,模式对话框是无父项的有点奇怪。 modal dialog的要点是显示在它的parent上,不允许访问parent。

因此,第一个建议是使其成为非模态的。我相信它会奏效。

顺便说一句,我刚刚尝试创建这样的对话框并且焦点没有问题。尝试简化您的代码:

    JDialog d = new JDialog();
    d.setSize(200, 200);
    d.setVisible(true);

这对我有用,我相信对你也有用。现在开始将这个简单的代码更改为您真正的应用程序代码。在某些时候它会停止工作,你会看到问题出在哪里。

如果没有任何帮助,请尝试使用我在 article 中描述的技巧.查找标题“可移植窗口激活”。我希望它会有所帮助。

关于java - 模态无父 JDialog 不抢焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9358742/

相关文章:

除非内联 lambda 表达式,否则 Javac 无法推断类型

java - 在面向对象编程 Java 中使用数组和方法

Java dom4j org/jaxen/NamespaceContext 异常

java - IE8 不在元素中注册模糊事件 - 在 dataGrid 中使用 ConsumerEvents

java - 使用 swing 显示另一个类的 BufferedImage

java - JPanel 上 Graphics2D 对象的相对定位

java - 如何从文本文件填充Java中的两个组合框?

java - 如何为字符串构建正则表达式?

java - 将 JScrollPane 滚动条移至右侧 SWING

Java Swing JTextPane text/html 不支持禁用属性