2013-06-11 2 views
6

Ich habe eine TabPane mit verschließbaren Tabs. Ich möchte ein "Close Tab Event" auslösen, wenn der Benutzer auf eine Schaltfläche im Tab-Inhalt klickt. Hier ist die Methode aufgerufen, wenn der Benutzer auf die Schaltfläche klickt:JavaFX - Schließen einer Registerkarte in TabPane dynamisch

public class CustomTab extends Tab { 

    ... 

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

    .... 
} 

ich diese benutzerdefinierten Registerkarte in dem tabpane als:

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

Normalerweise können die Laschen durch den (Standard) in der Nähe Icons klicken geschlossen in der Kopfzeile der Registerkarte und "Geschlossen!" wird auf den Bildschirm gedruckt. Wenn der Benutzer jedoch auf die Schaltfläche klickt (die sich im Inhalt der Registerkarte befindet) und close() Methode von CustomTab aufruft, wird wieder "Closed!" wird auf den Bildschirm gedruckt, aber die Registerkarte wird dieses Mal nicht geschlossen. Ist es nicht komisch?

Wie kann ich einen Tab schließen, wenn ich auf eine beliebige Schaltfläche klicke?

S.S .: tabPane.getTabs(). Remove (tab) funktioniert, aber das Auslösen des entsprechenden Ereignisses ist sehr elegant. Es sollte auch die Registerkarte schließen.

+0

welche javafx-version verwenden sie? seit 8.0 gibt es ein "TAB_CLOSE_REQUEST_EVENT" – Sebastian

+0

Da 8.0 nicht offiziell ist, und nicht in Standard jre enthalten, verwende ich 2.2. – Ramazan

+0

1: Wie der Name des Ereignisses "Tab.CLOSED_EVENT" anzeigt, sollte das Ereignis ausgelöst werden, nachdem die Registerkarte geschlossen wurde. IMHO die [Dokumentation] (http://docs.oracle.com/javafx/2/api/javafx/scene/control/Tab.html#CLOSED_EVENT) ist ein bisschen verschwommen. 2: Durch einfaches Aufrufen des Ereignisses wird die Registerkarte nicht geschlossen. Ihre Methode, die 'tabPane.getTabs(). Remove (tab)' aufruft, ist korrekt. – pmoule

Antwort

9

Der Ansatz, der nur tabPane.getTabs().remove(tab) verwendet, ist nicht vollständig korrekt, da er den Handler "onClosed" nicht aufruft, wenn er gesetzt ist. ich die folgende Methode verwendet:

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

, die die Registerkarte entfernen, wenn kein Handler gesetzt oder rufen Sie den „OnClosed“ Handler.

8

Ich öffnete eine feature request dafür. wenn Sie mit Java 8 und keine benutzerdefinierten TabPane Haut verwenden, können Sie diese Abhilfe

In der Zwischenzeit verwenden, um das genaue Schließverhalten zu imitieren, die statt ist zu nehmen, wenn die Schließen-Schaltfläche geklickt wird:

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

Funktioniert einwandfrei, danke! – user11153

+0

Elegant. Vielen Dank. –

+0

Und die Feature-Anfrage ist noch offen bis heute ... –