右对齐JWindow / JFrame与Java中的可视屏幕

时间:2013-11-05 16:18:01

标签: java swing

构造新的JWindow或JFrame时,是否可以将窗口边缘与显示器的可见边缘对齐?

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

如果感兴趣,以下是一些示例调试系统。第一台显示器左边的前两个,第二个显示器右侧的第三个测试:

Last Monitor Rectangle: java.awt.Rectangle[x=1920,y=150,width=1680,height=1050]
Point to compare : java.awt.Point[x=20,y=100], windowWidth:1270
rightBoundOfMonitor : 3600.0
rightBoundOfNewWindow : 1290.0
In bounds
Adjustment time : 2536893ns,  2.536893ms
Last Monitor Rectangle: java.awt.Rectangle[x=1920,y=150,width=1680,height=1050]
Point to compare : java.awt.Point[x=20,y=100], windowWidth:1270
rightBoundOfMonitor : 3600.0
rightBoundOfNewWindow : 1290.0
In bounds
Adjustment time : 65880ns,  0.06588ms
Last Monitor Rectangle: java.awt.Rectangle[x=1920,y=150,width=1680,height=1050]
Point to compare : java.awt.Point[x=3147,y=315], windowWidth:1270
rightBoundOfMonitor : 3600.0
rightBoundOfNewWindow : 4417.0
Out of bounds
Adjustment time : 152949ns,  0.152949ms

编辑:性能并不像我最初想的那么多。 (毫秒1000000 ns,而不是1000)。对GraphicsDevice的第一次调用需要大约2.5ms,这是可以接受的,后续调用确定位置要快得多。看起来目前没有API调用比我提出的更容易,或者其他人派生的。

1 个答案:

答案 0 :(得分:1)

作为参考,您可以将您的方法与将图钉固定在默认屏幕右下角的更简单example进行比较。目标是确定通过GraphicsDevice列表循环的哪个部分占据所花费的时间。我怀疑Rectangle#getBounds()是否重要,但GraphicsDevice#getDefaultConfiguration()可能是重要的。主机平台拥有top-level container,通常必须强制执行与Swing相同的单线程规则,因此您可以做的很少。