2013-06-11 116 views
6

我有一個帶有可關閉選項卡的TabPane。我想在用戶點擊標籤內容中的按鈕時觸發「關閉標籤事件」。這裏是調用的方法,當用戶點擊該按鈕:JavaFX - 動態關閉TabPane中的Tab鍵

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」,因此該選項卡關閉後應該觸發該事件。恕我直言,[文檔](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

功能請求至今仍然開放... –