2013-06-11 4 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); 

보통을 탭 가까이 아이콘을 (기본)를 클릭하여 닫을 수 있습니다 탭의 헤더에 "Closed!" 화면에 인쇄됩니다. 그러나 사용자가 단추 (내용의 탭에 있음)를 클릭하고 close() 메서드를 CustomTab으로 호출하면 "Closed!" 화면에 인쇄되지만 이번에는 탭이 닫히지 않습니다. 이상하지 않니?

임의의 버튼을 클릭하면 어떻게 탭을 닫을 수 있습니까?

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 [documentation] (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을 열었습니다. 한편

, 자바 (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

그리고 기능 요청은 현재까지 계속 열려 있습니다 ... –