我有一个启动的Java应用程序,创建一个GUI并且运行良好。如果用户更改屏幕分辨率(从1440x900切换到1280x768),我希望能够收听该事件。
有什么想法吗?
PS - 我想在事件/侦听器模式下执行此操作,而不是在轮询模式下执行此操作,因此额外的CPU周期不会浪费在像计时器每隔N秒不断轮询屏幕大小以查看是否已更改的情况下
答案 0 :(得分:4)
这篇文章很旧,但是: - 每秒轮询屏幕大小一次不会对性能产生任何影响 - 当屏幕调整大小时,每个窗口都应该接收一个repaint()调用(您需要针对您定位的操作系统进行测试)
答案 1 :(得分:2)
我认为Java本身并不能做到这一点。您必须在操作系统中有一个“钩子”来检测此更改,并且可能希望考虑使用JNA,JNI或单独的实用程序(例如可能向您的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)
以下是我对此问题的建议,
java.awt.event.ComponentListener
的接口。 componentResized(ComponentEvent e)
。