2013-06-11 63 views
6

Tôi có một TabPane với các tab có thể đóng. Tôi muốn kích hoạt "sự kiện tab đóng" khi người dùng nhấp vào nút trong nội dung của tab. Dưới đây là phương pháp được gọi khi người dùng nhấp vào nút:JavaFX - đóng một Tab trong TabPane động

public class CustomTab extends Tab { 

    ... 

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

    .... 
} 

tôi thêm tab tùy chỉnh này để tabpane như:

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); 

Thông thường, các tab có thể được đóng bằng cách nhấn vào (mặc định) biểu tượng gần trong tiêu đề của tab và "Đã đóng!" được in ra màn hình. Tuy nhiên, khi người dùng nhấp vào nút (có nghĩa là nội dung của tab) và gọi phương thức close() của CustomTab, một lần nữa, "Đã đóng!" được in lên màn hình, nhưng tab này không được đóng trong lần này. Nó có lạ không?

Làm cách nào để đóng tab khi nhấp vào nút tùy ý?

P.S .: tabPane.getTabs(). Xoá (tab) hoạt động, nhưng việc kích hoạt sự kiện tương ứng là rất thanh lịch. Nó cũng sẽ đóng tab.

+0

bạn đang sử dụng phiên bản javafx nào? kể từ 8.0, có một "TAB_CLOSE_REQUEST_EVENT" – Sebastian

+0

Vì 8.0 không chính thức và không chứa trong jre mặc định, tôi đang sử dụng 2.2. – Ramazan

+0

1: Vì tên sự kiện 'Tab.CLOSED_EVENT' cho biết, sự kiện sẽ được kích hoạt sau khi tab bị đóng. IMHO [tài liệu] (http://docs.oracle.com/javafx/2/api/javafx/scene/control/Tab.html#CLOSED_EVENT) hơi mờ. 2: Đơn giản gọi sự kiện không đóng tab. Cách tiếp cận của bạn gọi là 'tabPane.getTabs(). Remove (tab)' là đúng. – pmoule

Trả lời

9

Cách tiếp cận chỉ sử dụng tabPane.getTabs().remove(tab) không hoàn toàn chính xác vì nó không gọi trình xử lý "onClosed" nếu đã được đặt. Tôi đang sử dụng các phương pháp sau đây:

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

mà loại bỏ các tab nếu không xử lý được thiết lập hay gọi là "onClosed" xử lý.

8

Tôi đã mở một feature request cho việc này.

Trong khi đó, nếu bạn đang sử dụng Java 8 và không sử dụng giao diện tuỳ chỉnh TabPane, bạn có thể sử dụng workaround này để bắt chước các hành vi bế mạc chính xác đó là diễn ra khi nút đóng được nhấp:

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

Hoạt động hoàn hảo, cảm ơn! – user11153

+0

Thanh lịch. Cảm ơn bạn. –

+0

Và yêu cầu tính năng vẫn mở cho đến ngày này ... –

Các vấn đề liên quan