检测用户进行的屏幕分辨率更改(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);
这是我对这个问题的建议,
- 每个swing对象都可以实现一个名为
java.awt.event.ComponentListener
的接口。 - 其中一个方法是
componentResized(ComponentEvent e)
。 - 您的主应用程序框架应实现此接口并覆盖resize事件方法。 这是你如何收听resize事件,Checkout 这个链接 。 我希望这可以帮助你。
- 加载rJava时出错
- 为什么这个java 8流操作求值为Object而不是List 或只是List?
- Java中的Unicode到字符串转换
- PrintStream对象out由null初始化,我们如何调用它的方法?
- 在Spring中指定包含值的列表的最简单方法是什么?
- Eclipse在哪里找到javac来编译项目?
- 为什么Java BufferedReader()没有正确读取阿拉伯语和中文字符?
- NoSuchMethodError:org.apache.http.conn.scheme.Scheme。(Ljava / lang / String; ILorg / apache / http / conn / scheme / SchemeSocketFactory;)V
- LOG4J:使用自定义appender修改记录的消息