2013-06-11 11 views
6

Ho un TabPane con schede chiudibili. Voglio attivare un "evento di chiusura" quando l'utente fa clic su un pulsante nel contenuto della scheda. Ecco il metodo chiamato quando l'utente fa clic sul pulsante:JavaFX - chiusura dinamica di una scheda in TabPane

public class CustomTab extends Tab { 

    ... 

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

    .... 
} 

aggiungo questa scheda personalizzata per tabpane come:

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

Normalmente, le linguette possono essere chiuse cliccando il (default) vicino icone nell'intestazione della scheda e "Chiuso!" è stampato sullo schermo. Tuttavia, quando l'utente fa clic sul pulsante (ovvero nel contenuto della scheda) e chiama il metodo close() di CustomTab, di nuovo, "Chiuso!" viene stampato sullo schermo, ma questa volta la scheda non viene chiusa. Non è strano?

Come posso chiudere una scheda facendo clic su un pulsante arbitrario?

P.S .: tabPane.getTabs(). Remove (scheda) funziona, ma l'evento corrispondente è molto elegante. Dovrebbe anche chiudere la scheda.

+0

quale versione di javafx stai usando? dal 8.0, c'è un "TAB_CLOSE_REQUEST_EVENT" – Sebastian

+0

Poiché 8.0 non è ufficiale, e non contenuto nel jre predefinito, sto usando 2.2. – Ramazan

+0

1: Come indica il nome dell'evento 'Tab.CLOSED_EVENT', l'evento dovrebbe essere attivato dopo che la scheda è stata chiusa. IMHO la [documentazione] (http://docs.oracle.com/javafx/2/api/javafx/scene/control/Tab.html#CLOSED_EVENT) è un po 'confusa. 2: Semplicemente invocando l'evento non si chiude la scheda. Il tuo approccio chiamando 'tabPane.getTabs(). Remove (tab)' è corretto. – pmoule

risposta

9

L'approccio utilizzando solo tabPane.getTabs().remove(tab) non è completamente corretto perché non chiama il gestore "onClosed" se impostato. Sto utilizzando il seguente metodo:

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

che rimuovere la scheda se nessun gestore è impostato o chiamare il "onClosed" gestore.

8

Ho aperto un feature request per questo.

Nel frattempo, se si utilizza Java 8 e non si utilizza una pelle TabPane personalizzato, è possibile utilizzare questa soluzione per simulare il comportamento di chiusura esatto che sta avvenendo quando il pulsante di chiusura si fa clic:

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

Funziona perfettamente, grazie! – user11153

+0

Elegante. Grazie. –

+0

E la richiesta di funzionalità è ancora aperta fino ad oggi ... –

Problemi correlati