【问题标题】:How can I get mouse focus on Windows PCs when using modal Swing?使用模态 Swing 时如何在 Windows PC 上获得鼠标焦点?
【发布时间】:2021-04-14 18:59:49
【问题描述】:

我需要在 Windows 10 计算机上拖动没有键盘焦点的窗口。我的 PC 上的 Swing 功能拒绝在同一个 Java 应用程序中的所有窗口上“鼠标聚焦”;它们被锁定,无法移动或被发现。

最新的 Swing 对话窗口控制显示;当其他应用程序窗口覆盖时,查看所需的任何其他窗口(以帮助回答对话框)不可用。在 Mac/OS X 上,鼠标焦点不是问题;所有窗户似乎都有它。

在使用方便的模态 Swing 功能时,有没有办法在 PC 上获得这种“鼠标焦点”?

我的应用程序中有问题的 3 个窗口是:

  1. 对话框:最新的 Swing 对话框集中了所有鼠标焦点
  2. Blocker:一个 JFrame 或 JDialog 窗口,它可能是也可能不是 Dialog 的祖先,但它是一个足够大的窗口来阻止 Blockee 的视图
  3. 被阻止者:拥有回答对话所需信息的人。 在这种情况下,只能在 Windows 10 上拖动 Dialog。 将所需的信息移入对话框是唯一的答案吗? 是否有 Windows 10 设置可以使其执行更明智? 我尝试为 Blockee 和 Blocker 使用不同的线程,但无济于事。

【问题讨论】:

  • 我从来没有遇到过拖动模态 JDialog 的问题。发布您的minimal reproducible example 来证明问题。
  • 是的,当您打开模态 JDialog 时,无法在 Windows 10 上移动底层 JFrame。要么使您的 JDialog 更小以便可以将其移开,要么从 JFrame 中复制信息到 JDialog,这样用户就不必再参考 JFrame。
  • 不幸的是,勒布朗先生所说的看起来是正确的。我编辑了我的问题以激发更好的选择。

标签: java windows swing modal-dialog focus


【解决方案1】:

对于许多情况,我发现了一个相当简单的解决方法:识别 Blocker 窗口,然后在它可能是一个阻止器并且不再需要时取消它的可聚焦性(可能是暂时的)。

java.awt.Frame blocker = this; // or <parent> <grandparent>, etc.
blocker.setFocusable(false);

这不会使 Blocker 或 Blockee 窗口可移动,但它通过防止阻塞来消除问题。也许有一天在 Windows 10 中会有更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多