【问题标题】:Right align JWindow/JFrame with viewable screen in Java将 JWindow/JFrame 与 Java 中的可视屏幕右对齐
【发布时间】:2013-11-05 16:18:01
【问题描述】:

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

【问题讨论】:

    标签: java swing


    【解决方案1】:

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

    【讨论】:

    • 看起来第一次 GraphicsEnvironment.getLocalGraphicsEnvironment 和 getScreenDevices 都在 20-30ms 范围内。在随后的运行中,这些变得可以忽略不计。显示 ns,因为大多数在 ms 中舍入为 0:GraphicsEnvironment.getLocalGraphicsEnvironment = 25316284ns,getScreenDevices = 28968839ns,screen.getDefaultConfiguration = 442955ns,gc.getBounds = 514795ns,rect.getX = 34099ns,screen.getDefaultConfiguration = 277756ns,gc.getBounds = rect.getX = 331ns
    • 我看不出你能做多少,除了飞行速度较慢的那些。你能更新你的问题吗?我羡慕你在评论中比较多位数 ns 的能力,:-)
    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2016-12-07
    • 2022-06-24
    • 2021-11-11
    • 2017-02-01
    相关资源
    最近更新 更多