在构建新的 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 调用更容易做到这一点,或者其他人已经派生了。