1

在构建新的 JWindow 或 JFrame 时,是否可以将窗口边缘与监视器的可见边缘右对齐?

这将用于具有多个监视器的 Windows 系统。理想情况下,我希望新窗口的右边缘对齐最右侧屏幕的右边缘。目前,如果我检测到窗口的右边缘是否超出可见屏幕区域的范围,我正在通过获取 GraphicsDevices、排序、比较点位置 + 窗口大小并调整位置以在显示前“移动”窗口来执行此操作。我在找到这个基本上是相同想法的问题之前这样做了(How to know if a JFrame is on screen in a multi screen environment)。这实现了目标。我知道 SSCCE 广告商希望我发布我已经在做的事情,如果有兴趣,另一个问题中已经有一个,但我的目的是询问是否有更简单/更本地的方式来获得这些结果?作为旁注,第一次调用需要 2.6 毫秒,每次额外调用需要 0.066 毫秒。最初我的纳秒到毫秒数学是错误的,所以现在性能不是一个因素,但我仍然很好奇是否有更好的方法来做到这一点。

如果有兴趣,这里有一些示例调试系统输出。第一个显示器左侧的前两个,第二个显示器右侧的第三个测试:

最后一个监视器矩形:java.awt.Rectangle[x=1920,y=150,width=1680,height=1050]
比较点:java.awt.Point[x=20,y=100], windowWidth:1270
rightBoundOfMonitor : 3600.0
右边界新窗口:1290.0
界内
调整时间:2536893ns、2.536893ms
最后一个监视器矩形:java.awt.Rectangle[x=1920,y=150,width=1680,height=1050]
比较点:java.awt.Point[x=20,y=100], windowWidth:1270
rightBoundOfMonitor : 3600.0
右边界新窗口:1290.0
界内
调整时间:65880ns,0.06588ms
最后一个监视器矩形:java.awt.Rectangle[x=1920,y=150,width=1680,height=1050]
比较点:java.awt.Point[x=3147,y=315], windowWidth:1270
rightBoundOfMonitor : 3600.0
rightBoundOfNewWindow : 4417.0
越界
调整时间:152949ns,0.152949ms

编辑: 性能并不像我最初想象的那么严重。(一毫秒内为 1000000 ns,而不是 1000)。对 GraphicsDevice 的第一次调用需要大约 2.5 毫秒,这是可以接受的,随后调用确定位置要快得多。似乎目前没有比我想出的 API 调用更容易做到这一点,或者其他人已经派生了。

4

1 回答 1

1

作为参考,您可以将您的方法与这个更简单的示例进行比较,该示例将框架固定到默认屏幕的右下角。目标是确定循环GraphicsDevice列表的哪一部分占主导地位。我怀疑这Rectangle#getBounds()很重要,但GraphicsDevice#getDefaultConfiguration()可能是。顶级容器归宿主平台所有,它通常必须执行与 Swing 相同的单线程规则,因此您可能无能为力。

于 2013-11-05T18:04:18.117 回答