2015-12-21 3 views
1

У меня есть табличка Ваадина. Все вкладки являются закрываемыми. Я определил пользовательский CloseHandler. Когда Tab закрывается с помощью маленькой кнопки x, выполняется CloseHadler; однако, если я закрою вкладку программноПринуждение к таблице Ваадина для использования CloseHandler

TabSheet parent = (TabSheet) this.getParent(); 
parent.removeTab(parent.getTab(this)); 

Тесный обработчик не выполняется. Есть ли способ заставить CloseHandler выполнить перед удалением Tab.

Спасибо,

Оливер

+0

Если вы посмотрите на [источники] (https://github.com/vaadin/vaadin/blob/master/server/src/com/vaadin/ui/ TabSheet.java) вы заметите, что конструктор 'TabSheet' определяет по умолчанию' CloseListener', который просто вызывает 'tabsheet.removeComponent (c)', что и делает 'removeTab (вкладка Tab)'. Угадайте, что произойдет, если вы позвоните другому :-). В таких обстоятельствах я бы пришел к выводу, что, помимо собственно вызова «CloseHandler» самостоятельно, нет другого (чистого и простого) способа программного запуска его выполнения. – Morfic

+0

Спасибо за ваш ответ. 'tabsheet.removeComponent (c)' дает такое же поведение. Я надеялся, что сможет вызвать CloseHandler, отправив CloseEvent, например [fireSelectedTabChange] (https://vaadin.com/api/com/vaadin/ui/TabSheet.html#fireSelectedTabChange%28%29), но я не см. что-нибудь в документации, которая позволила бы мне это сделать. Думаю, мне придется придумать грязное решение ... –

ответ

0

Решение было бы расширить TabSheet класс и переопределить removeTab(), чтобы заставить его выполнить closeHandler. Поскольку TabSheet.closeHandler является частным, вам также необходимо переопределить это поле и его сеттер. Ваадин мог сделать вещи проще (сменив closeHandler на protected или предоставляя геттер), но я не вижу его «грязным» решением.

public class MyTabSheet extends TabSheet { 

    private static final long serialVersionUID = 1L; 

    private CloseHandler closeHandler; 

    @Override 
    public void removeTab(Tab tab) { 

     if (closeHandler != null) { 
      closeHandler.onTabClose(this, tab.getComponent()); 
     } 

     super.removeTab(tab); 
    } 

    @Override 
    public void setCloseHandler(CloseHandler handler) { 
     closeHandler = handler; 
     // needed for TabSheet.TabsheetServerRpcImpl 
     super.setCloseHandler(handler); 
    } 
} 

Если вы хотите, вы можете создать запрос функции в Vaadin (vaadin.com/bug), может быть, closeHandler следует называть по умолчанию. Там уже есть #10555, но ему 3 года ...