如何在java中监听图形环境或设备更改

在java中,可以使用当前的图形环境

GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 

而不是循环使用设备

 GraphicsDevice[] screenDevices = graphicsEnvironment.getScreenDevices(); for (int i = 0; i < screenDevices.length; i++) { GraphicsDevice graphicsDevice = screenDevices[i]; ... } 

但是, GraphicDevice的数量可以在运行时更改,例如通过插入USB监视器。 或者,如果有多个监视器,用户可以更改GraphicsDevice的分辨率或相对于另一个图形设备移动它。

如何监听GraphicsEnvironmentGraphicDevice的更改?

编辑

我尝试使用守护程序线程实现更改检测,该守护程序线程以特定间隔检查图形环境,但它不起作用。

它不起作用,因为GraphicsEnvironment保存在statc变量中并且仅初始化一次。

此外, GraphicsEnvironment的子类缓存GraphicDevice 。 因此,只有在重新启动jvm进程时才会检测到新的GraphicDevice

一个快速而肮脏的解决方案是批量执行一个小的java程序,它只将最后一次已知的图形环境存储在一个文件中,并在它发生变化时执行通知(执行应该是即时的,主要是运行jvm的成本)。

它并不优雅,但是以原生方式做某事需要跨平台,并且最终也会变得丑陋。 除非你不关心可移植性。

选择你的毒药。