2013-06-11 6 views
6

У меня есть TabPane с закрываемыми вкладками. Я хочу запустить событие закрытой вкладки, когда пользователь нажимает кнопку в содержимом вкладки. Вот метод вызывается, когда пользователь нажимает на кнопку:JavaFX - закрытие Tab в TabPane динамически

public class CustomTab extends Tab { 

    ... 

    protected void close() { 
     Event.fireEvent(this, new Event(Tab.CLOSED_EVENT)); 
    } 

    .... 
} 

я добавить эту пользовательскую вкладку tabpane как:

TabPane tabPane = new TabPane(); 
... 
CustomTab tab = new CustomTab(); 
tab.setOnClosed(new EventHandler<Event>() { 
    @Override 
    public void handle(Event t) { 
     System.out.println("Closed!"); 
    } 
}); 
tabPane.getTabs().add(tab); 
tabPane.getSelectionModel().select(tab); 

Обычно, вкладки могут быть закрыты, нажав (по умолчанию), близкие иконки в заголовке вкладки и «Закрыто!». печатается на экране. Однако, когда пользователь нажимает кнопку (то есть в содержимом вкладки) и вызывает метод close()CustomTab, снова «Закрыто!». печатается на экране, но на этот раз вкладка не закрывается. Разве это не странно?

Как закрыть вкладку при нажатии на произвольную кнопку?

P.S .: tabPane.getTabs(). Remove (tab) работает, но стрельба по соответствующему событию очень изящна. Он также должен закрыть вкладку.

+0

какая версия javafx вы используете? с 8.0 существует «TAB_CLOSE_REQUEST_EVENT» – Sebastian

+0

Так как 8.0 не является официальным и не содержится в стандартном jre, я использую 2.2. – Ramazan

+0

1: Поскольку имя события 'Tab.CLOSED_EVENT' указывает, событие должно быть запущено после закрытия вкладки. IMHO [документация] (http://docs.oracle.com/javafx/2/api/javafx/scene/control/Tab.html#CLOSED_EVENT) немного нечеткая. 2: Простое вызов события не закрывает вкладку. Ваш подход, вызывающий 'tabPane.getTabs(). Remove (tab)' правильный. – pmoule

ответ

9

Подход с использованием только tabPane.getTabs().remove(tab) не совсем корректен, потому что он не называет обработчик onClosed, если установлен. Я использую следующий метод:

private void closeTab(Tab tab) { 
     EventHandler<Event> handler = tab.getOnClosed(); 
     if (null != handler) { 
      handler.handle(null); 
     } else { 
      tab.getTabPane().getTabs().remove(tab); 
     } 
    } 

который удалить вкладку, если обработчик не установлен или называют «OnClosed» обработчик.

8

Для этого я открыл feature request.

В то же время, если вы используете Java 8 и не использовать пользовательские TabPane кожи, вы можете использовать этот обходной путь, чтобы имитировать точное поведение закрытия, которая берет место, когда нажать на кнопку закрытия:

import javafx.scene.control.Tab; 

import com.sun.javafx.scene.control.behavior.TabPaneBehavior; 
import com.sun.javafx.scene.control.skin.TabPaneSkin; 

public class MyTab extends Tab { 

    public void requestClose() { 
     TabPaneBehavior behavior = getBehavior(); 
     if(behavior.canCloseTab(this)) { 
      behavior.closeTab(this); 
     } 
    } 

    private TabPaneBehavior getBehavior() { 
     return ((TabPaneSkin) getTabPane().getSkin()).getBehavior(); 
    } 
} 
+0

Работает безупречно, спасибо! – user11153

+0

Элегантный. Спасибо. –

+0

И запрос функции по-прежнему открыт по сей день ... –

Смежные вопросы