【问题标题】:modal parentless JDialog does not grab focus模态无父 JDialog 不抓住焦点
【发布时间】:2012-02-20 09:26:13
【问题描述】:

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

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

不幸的是它有一个恼人的特点,就是出现的时候,虽然走到了前面,却不抢焦点。

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

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

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

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

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

【问题讨论】:

  • 我们使用requestFocusInWindow()而不是requestFocus()。希望能有所帮助。
  • 应该可以在没有任何额外代码的情况下工作,无法重现所描述的问题

标签: java swing


【解决方案1】:

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

因此,第一个建议是将其设为非模态。我相信它会起作用。

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

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

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

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

【讨论】:

  • 是的,我的人为示例确实有效......问题是在登录提示之前首先出现了一个“启动画面” - 我怀疑这会以某种方式混淆焦点。
【解决方案2】:

请参阅 Dialog Focus 以了解使用 RequestFocusListener 的潜在修复。我已成功使用它在JOptionPane 对话框中设置焦点。

【讨论】:

    【解决方案3】:

    1) 您必须创建 JDialog 内容并显示包装在 invokeLater() 中的容器

    或者最好和最安全的方法是

    2) 你必须设置为ModalityTypesModal for parent

    3) 在应用程序生命周期中,容器中只有一个可以是 Modal

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      相关资源
      最近更新 更多