Vaadin中Window.ResizeListener未被触发的问题咨询
Vaadin Window.ResizeListener 未触发的原因及解决办法
我来帮你排查这个窗口调整大小监听器没生效的问题,结合你的代码来看,核心问题出在监听器的注册方式上,下面详细拆解:
可能的原因
你代码里用了addListener(this)来注册监听器,但在你使用的Vaadin版本(从UNITS_PIXELS常量来看应该是Vaadin 6)中,通用的addListener方法无法自动识别Window.ResizeListener对应的事件类型,导致监听器没有正确绑定到窗口的resize事件上。
另外可以快速确认两个前置条件:
- 你已经设置了
setResizable(true)(代码里已经配置,这部分没问题) - 窗口已经被正确添加到UI并显示(如果窗口没被打开,自然不会触发resize事件)
解决办法
把监听器的注册代码替换为针对ResizeEvent的明确绑定方式:
针对Vaadin 6版本(匹配你的代码环境)
将构造方法里的addListener(this)替换为:
addListener(ResizeEvent.class, this, "windowResized");
这行代码明确指定了要监听的事件类型是ResizeEvent,并将其绑定到你的windowResized方法上。
修改后的完整构造方法示例:
public ExchangeWindow() { center(); setWidth(600, Unit.PIXELS); setHeight(430, Unit.PIXELS); setModal(true); setResizable(true); setImmediate(true); // 替换原addListener(this)为下面这行 addListener(ResizeEvent.class, this, "windowResized"); }
如果后续升级到Vaadin 7及以上版本
Vaadin 7+废弃了旧的addListener方法,改用类型安全的监听器注册方式:
addResizeListener(this);
同时注意,Vaadin 7+里的单位常量是Unit.PIXELS(不再是你代码里的UNITS_PIXELS,升级时需要同步修改)。
额外验证小技巧
可以先在windowResized方法里加一行日志输出,快速验证监听器是否触发:
@Override public void windowResized(ResizeEvent resizeEvent) { System.out.println("窗口调整大小事件已触发!"); // 你的原有逻辑 if(left.isVisible()) { exchangeTable.setWidth(600, UNITS_PIXELS); } }
内容的提问来源于stack exchange,提问作者masiboo
相关产品推荐
相关产品推荐

