如何让swing应用知道屏幕尺寸的变化?

当我的swing应用程序运行时,我改变了屏幕的大小(例如从1024×768到800×600)。

我有什么事情可以收听通知吗?

或者,我可以在几秒钟内检查屏幕大小,但Toolkit.getScreenSize()会一直告诉我旧值。
如何在更改后获得真正的屏幕尺寸?

环境:Linux(在SuSE ES 11和Ubuntu 9.04上测试)

我感谢您的帮助。
马顿

以下对我有用,但我在Mac上,所以我不能肯定它会在Linux上运行:

System.out.println(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getWidth() + "x" + GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getHeight()); //Ignore this block, it was simply to give me a chance to change my resolution Scanner readUserInput=new Scanner(System.in); System.out.println("Waiting on input, go change your resolution"); String myName=readUserInput.nextLine(); System.out.println(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getWidth() + "x" + GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode().getHeight()); 

输出(实际上是输入)如下:

 1440x900 Waiting on input, go change your resolution blah 1280x960 

显然,如果你有多个屏幕设备,你将不得不更加谨慎。

要计算显示大小,可以使用(取自GraphicsConfiguration javadoc)

  Rectangle virtualBounds = new Rectangle(); GraphicsEnvironment ge = GraphicsEnvironment. getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int j = 0; j < gs.length; j++) { GraphicsDevice gd = gs[j]; GraphicsConfiguration[] gc = gd.getConfigurations(); for (int i=0; i < gc.length; i++) { virtualBounds = virtualBounds.union(gc[i].getBounds()); } } 

然后,您可以查询virtualBoundswidthheight

这也适用于多显示器设置。

据我所知,没有JDK支持的方法来检测更改,因此轮询是您唯一的选择,或者使用JNA和本机代码。 如果您的顶级窗口最大化,那么调整显示大小也会调整任何最大化窗口的大小,因此您也可以在那里监听更改。 有关编写组件侦听器的示例,请参阅此sun教程 。

如果您没有顶级最大化窗口,那么您也可以通过创建隐藏的最大化窗口来实现相同的效果。 我不能确定这是否有效,但值得尝试。

Dimension screenSize = Toolkit.getDefaultToolkit()。getScreenSize();

f.setSize(screenSize.width,screenSize.height);