检测用户更改屏幕分辨率(Java监听器?)

10

我有一个Java应用程序,它可以启动、创建GUI并正常运行。如果用户更改屏幕分辨率(从1440x900切换到1280x768),我希望能够监听该事件。

有什么想法吗?

顺便提一句 - 我希望以事件/监听器模式实现此功能,而不是使用轮询模式,在这种模式下,不需要花费额外的CPU周期来定期轮询屏幕尺寸是否发生变化。


这是一个Swing应用程序吗? - Santosh
5个回答

4
这篇文章虽然有些陈旧,但请注意: - 每秒轮询屏幕尺寸不会对性能产生任何影响。 - 当屏幕大小改变时,每个窗口都应该接收到repaint()调用(你需要测试你所针对的操作系统) 。

2
我认为Java本身无法完成这个任务。您需要在操作系统中有一个“钩子”来检测此更改,可能需要考虑使用 JNAJNI 或单独的实用程序(例如Sigar),以便将信息报告给Java程序。出于好奇,您为什么要这样做?是为了制作游戏或调整GUI应用程序的大小吗?

气垫船(不错的MP参考),我也是这么想的。通过JNI,我可以钩取WinProc,拦截所有WM_*消息,并以此跟踪它。但我还希望有一种本地函数,因为对于Java应用程序来说,了解这样的信息似乎很重要,因此JVM和本地监听器应该提供这样的功能。 - Rick Hodgin

2
除了Hovercraft的建议外,您可能还可以考虑使用后台线程来检查当前屏幕分辨率,使用Toolkit.getScreenSize()。您需要测试此功能以确定该线程对系统性能的影响有多大。它检查更改的频率取决于您的要求(应用程序需要多快地响应更改)。

1
您可以创建一个全局的PAINT监听器来检测屏幕调整大小。
// screen resize listener
    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

        @Override
        public void eventDispatched(AWTEvent event) {
// take a look at https://dev59.com/pWkw5IYBdhLWcg3wHW7n
            Rectangle newSize = getEffectiveScreenSize(); 
            if (newSize.width != windowSize.width || newSize.height != windowSize.height)
                resize();

        }
    }, AWTEvent.PAINT_EVENT_MASK);

-1

我对于这个问题有以下建议:

  1. 每一个Swing对象都可以实现名为 java.awt.event.ComponentListener 的接口。
  2. 其中一个方法是 componentResized(ComponentEvent e)
  3. 你的主应用程序框架应该实现这个接口并重写调整大小事件方法。
    这就是如何监听调整大小事件,点击this link查看。希望这能帮到你。

1
据我所知,如果用户调整了窗口大小或将窗口最大化并更改了视频模式,则主框架将被调整大小,并在这种情况下调用componentResized()。但是,在大小为X的非最大化窗口的情况下,更改视频模式不会强制该窗口(框架)调整自身大小,而是一旦调整视频模式,它将以其原始大小悬挂在屏幕的边缘上,从未接收到componentResized()的调用。 - Rick Hodgin
可能因为您正在解决错误的问题而被点踩:正如Rick所述,ComponentListener在用户更改窗口大小时被调用,而不是在屏幕分辨率更改时被调用。 - toolforger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接