免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3733 | 回复: 7

改变窗体尺寸后,重新取得窗体大小出错 [复制链接]

论坛徽章:
0
发表于 2006-02-23 05:59 |显示全部楼层
以下代码由改变窗体大小(最大化/还原)触发

  1.         private void rootWindowStateChanged(WindowEvent evt) {
  2.                 System.out.println("this.windowStateChanged, event=" + evt);
  3.                 //TODO add your code for this.windowStateChanged
  4.                 System.out.println(evt.getWindow().getWidth() + " - " + evt.getWindow().getHeight());
  5.         }
复制代码


this.windowStateChanged, event=java.awt.event.WindowEvent[WINDOW_STATE_CHANGED,opposite=null,oldState=0,newState=6] on frame0
1288 - 1002
this.windowStateChanged, event=java.awt.event.WindowEvent[WINDOW_STATE_CHANGED,opposite=null,oldState=6,newState=0] on frame0
400 - 300
this.windowStateChanged, event=java.awt.event.WindowEvent[WINDOW_STATE_CHANGED,opposite=null,oldState=0,newState=6] on frame0
400 - 300
this.windowStateChanged, event=java.awt.event.WindowEvent[WINDOW_STATE_CHANGED,opposite=null,oldState=6,newState=0] on frame0
1288 - 1002


如log所示,事件触发后显示的窗体大小并不一定是改变后的大小。请问有谁知道怎么解决吗?

一个简单的变通的方法是取得大小之前先Sleep片刻,但是有什么方法可以确保完成大小改变以后再取数值吗?

[ 本帖最后由 perryhg 于 2006-2-23 12:14 编辑 ]

论坛徽章:
0
发表于 2006-02-23 09:30 |显示全部楼层
不太清楚evt里装的是不是new size,为什么不直接查询frame呢?

论坛徽章:
0
发表于 2006-02-23 09:40 |显示全部楼层
刚注意到怎么是rootWindowStateChanged??哪个接口里的方法?

论坛徽章:
0
发表于 2006-02-23 12:11 |显示全部楼层

  1.                          this.addWindowStateListener(new WindowStateListener() {
  2.                                 public void windowStateChanged(WindowEvent evt) {
  3.                                         rootWindowStateChanged(evt);
  4.                                 }
  5.                         });
复制代码


不是哪个接口的,是自己定义的。另外,直接用frame的getWidth()和getHeight()出来同样的结果。

论坛徽章:
0
发表于 2006-02-23 12:30 |显示全部楼层
找到解决方法了应该注册componentResized事件

  1.                         this.addComponentListener(new ComponentAdapter() {
  2.                                 public void componentResized(ComponentEvent evt) {
  3.                                         rootComponentResized(evt);
  4.                                 }
  5.                         });
复制代码

论坛徽章:
0
发表于 2006-02-23 13:04 |显示全部楼层
可是,为什么呢?

论坛徽章:
0
发表于 2006-02-23 13:32 |显示全部楼层
查了一下doc,分别有如下两段叙述:

WindowListener:
When the window's status changes by virtue of being opened, closed, activated or deactivated, iconified or deiconified, the relevant method in the listener object is invoked, and the WindowEvent is passed to it

只关心open,close,active,deactive,icon,,,事件

ComponentListener
When the component's size, location, or visibility changes, the relevant method in the listener object is invoked, and the ComponentEvent is passed to it

原来真正关心size,location的是ComponentListener

论坛徽章:
0
发表于 2006-02-23 17:18 |显示全部楼层
Thanks to kakasi~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP