我们有一个应用程序,它作为第一个UI动作,显示一个没有父框架的模态JDialog。
public LoginDialog(Frame owner, Config config, Object... params) {
super((Frame)null, true);
不幸的是,它有一个恼人的特征,当它出现时,虽然它出现在前面,它并没有抓住焦点。
因此,用户在双击开始菜单启动应用程序后,必须使用鼠标选择“登录”对话框并输入信息。
有没有办法让这个JDialog在前面出现时抓住焦点?
我在调用setVisible(true)之前,之后和通过invokeLater尝试调用“requestFocus” - 但这些似乎没有任何效果。
我们如何让模态对话框抓住焦点?
更新:问题是用于尝试呈现背景“等待窗口”的代码。此窗口作为黑客显示在登录对话框的“后面”,这样当对话框消失时,用户将看到“请稍候”消息。因为它是应用程序创建的第一个窗口,所以它得到了关注。我不确定是否会有一种方法可以让对话在这个hack的事件调度线程中再次获得焦点 - 但我通过解决它并正确处理它来修复它。
答案 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)您必须设置ModalityTypes或Modal for parent
3)在应用程序生命周期中,只有一个来自容器的Modal