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

时间:2010-06-08 13:44:57

标签: java swing size screen toolkit

当我的swing应用程序运行时,我更改了屏幕的大小(例如从1024x768到800x600)。

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

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

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

感谢您的帮助 马顿

3 个答案:

答案 0 :(得分:2)

以下对我有用,但我在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

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

答案 1 :(得分:1)

要计算显示尺寸,您可以使用(取自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());
      }
  } 

然后,您可以查询width的{​​{1}}和height

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

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

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

答案 2 :(得分:-1)

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

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