什么时候调用Widget OnUnload()?

时间:2014-03-10 21:59:29

标签: gwt

你能告诉我什么时候调用小部件的OnUnload()?

我试图覆盖它,但它从未被访问过。还有什么是卸载复合的最佳方法,我使用RootPanel.get(“Dev1”)。clear();

1 个答案:

答案 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");