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

我有一个Java应用程序启动,创建一个GUI,并且工作得很好。 如果用户更改屏幕分辨率(从1440×900切换到1280×768),我希望能够收听该事件。

有任何想法吗?

PS – 我想在事件/监听器模式下执行此操作,而不是在轮询模式下执行此操作,这样就不会浪费额外的CPU周期,例如定时器每隔N秒不断轮询屏幕大小以查看它是否已更改。

这篇文章很旧,但是: – 每秒轮询屏幕大小一次不会对性能产生任何影响 – 当屏幕resize时,每个窗口都应该接收一个repaint()调用(你需要为你的目标操作系统测试这个)

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

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

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

您可以创建全局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); 

这是我对这个问题的建议,

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