你能告诉我什么时候调用小部件的OnUnload()?
我试图覆盖它,但它从未被访问过。还有什么是卸载复合的最佳方法,我使用RootPanel.get(“Dev1”)。clear();
答案 0 :(得分:1)
如果您想在离开页面时停止计时器,请使用CloseHandler
。
页面关闭和刷新时会调用此处理程序。
Window.addCloseHandler(new CloseHandler<Window>() {
@Override
public void onClose(CloseEvent<Window> event) {
timer.cancel();
}
});
如果要在清除垂直面板时停止计时器,请使用removeFromParent
。
当任何窗口小部件从其父窗口移除时,将调用此重写方法。
private Timer timer = null;
/*
* This is the entry point method.
*/
public void onModuleLoad() {
final Label label = new Label("Hello ") {
@Override
public void removeFromParent() {
if (timer != null && this.isAttached()) {
timer.cancel();
System.out.println("timer is stopped");
}
super.removeFromParent();
}
};
timer = new Timer() {
@Override
public void run() {
label.setText("Hello " + (int) (Math.random() * 100));
}
};
timer.scheduleRepeating(500);
final VerticalPanel verticalPanel = new VerticalPanel();
verticalPanel.add(label);
Button button = new Button("Remove Label");
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
label.removeFromParent();
}
});
verticalPanel.add(button);
RootPanel.get().add(verticalPanel);
}
根据您的评论,请尝试以下代码,clear
覆盖VerticalPanel
方法。
final VerticalPanel verticalPanel = new VerticalPanel(){
@Override
public void clear(){
if(this.isAttached()){
timer.cancel();
}
super.clear();
}
};
verticalPanel.getElement().setId("Div1");