模态无父JDialog不会抓住焦点

时间:2012-02-20 09:26:13

标签: java swing

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

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

不幸的是,它有一个恼人的特征,当它出现时,虽然它出现在前面,它并没有抓住焦点。

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

有没有办法让这个JDialog在前面出现时抓住焦点?

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

我们如何让模态对话框抓住焦点?

更新:问题是用于尝试呈现背景“等待窗口”的代码。此窗口作为黑客显示在登录对话框的“后面”,这样当对话框消失时,用户将看到“请稍候”消息。因为它是应用程序创建的第一个窗口,所以它得到了关注。我不确定是否会有一种方法可以让对话在这个hack的事件调度线程中再次获得焦点 - 但我通过解决它并正确处理它来修复它。

3 个答案:

答案 0 :(得分:2)

首先,模态对话框是无父级的,这有点奇怪。模态对话框中的点是它显示在其父对象上,不允许访问父对象。

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

BTW我刚刚尝试创建这样的对话框并且没有焦点问题。尝试简化您的代码:

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

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

如果没有任何帮助尝试使用我在article中描述的技巧。寻找标题“便携式窗口激活”。我希望它会有所帮助。

答案 1 :(得分:2)

使用Dialog Focus查看RequestFocusListener可能的修复方法。我已成功使用它在JOptionPane对话框中设置焦点。

答案 2 :(得分:1)

1)您必须创建JDialog内容并显示包含在invokeLater()

内的容器

或最好和最安全的方式是

2)您必须设置ModalityTypesModal for parent

3)在应用程序生命周期中,只有一个来自容器的Modal