检测用户进行的屏幕分辨率更改(Java Listener?)

时间:2011-09-17 13:57:28

标签: java swing listener screen-resolution

我有一个启动的Java应用程序,创建一个GUI并且运行良好。如果用户更改屏幕分辨率(从1440x900切换到1280x768),我希望能够收听该事件。

有什么想法吗?

PS - 我想在事件/侦听器模式下执行此操作,而不是在轮询模式下执行此操作,因此额外的CPU周期不会浪费在像计时器每隔N秒不断轮询屏幕大小以查看是否已更改的情况下

5 个答案:

答案 0 :(得分:4)

这篇文章很旧,但是:   - 每秒轮询屏幕大小一次不会对性能产生任何影响   - 当屏幕调整大小时,每个窗口都应该接收一个repaint()调用(您需要针对您定位的操作系统进行测试)

答案 1 :(得分:2)

我认为Java本身并不能做到这一点。您必须在操作系统中有一个“钩子”来检测此更改,并且可能希望考虑使用JNAJNI或单独的实用程序(例如可能向您的Java程序报告的Sigar)。出于好奇,你为什么要这样做?它是用于您正在制作的游戏还是可以重新调整GUI应用程序的大小?

答案 2 :(得分:2)

除了Hovercrafts的建议外,您可以考虑使用Toolkit.getScreenSize()检查当前屏幕分辨率的后台线程。

您需要对此进行测试,以了解该线程对系统的性能影响有多大。检查更改的频率取决于您的要求(应用程序对更改做出反应的速度)

答案 3 :(得分:1)

您可以创建一个全局PAINT侦听器来检测屏幕大小调整。

// screen resize listener
    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

        @Override
        public void eventDispatched(AWTEvent event) {
// take a look at http://stackoverflow.com/questions/10123735/get-effective-screen-size-from-java
            Rectangle newSize = getEffectiveScreenSize(); 
            if (newSize.width != windowSize.width || newSize.height != windowSize.height)
                resize();

        }
    }, AWTEvent.PAINT_EVENT_MASK);

答案 4 :(得分:-1)

以下是我对此问题的建议,

  1. 每个swing对象都可以实现一个名为java.awt.event.ComponentListener的接口。
  2. 其中一种方法是componentResized(ComponentEvent e)
  3. 您的主应用程序框架应实现此接口并覆盖resize事件方法。 这是您收听调整大小事件Checkout this link的方式。我希望这会对你有所帮助。