2012-11-24 6 views
7

Ho creato un programma in cui ho creato un TabPane, in cui ci sono più schede. Voglio farlo quando qualcuno cerca di chiudere una scheda, quindi voglio eseguire il mio codice. Quando l'utente fa clic sul pulsante di chiusura predefinito per qualsiasi scheda, quindi chiederà conferma. Se l'utente dice "Sì", la scheda verrà chiusa altrimenti rimarrà aperta.Tab consumare in TabPane alla chiusura di default

Come posso fare questo?

Sto facendo qualcosa come di seguito. ma si sta ancora chiudendo. Come potrei consumare quella scheda?

Tab tab = new Tab(); 
TabPane tabPane=new TabPane(); 
tabPane.getTabs().add(tab); 

tab.setOnClosed(new EventHandler<Event>() { 
      @Override 
      public void handle(Event t) { 
       t.consume(); 
      } 
     }); 

risposta

4

Sto seguendo la mia strada come indicato di seguito.
Ho creato un collegamento ipertestuale e l'ho impostato come grafico per quella scheda e funziona correttamente per me.

Hyperlink hlink = new Hyperlink(); 
Image image = new Image(MyClass.class.getResourceAsStream("/images/close.png")); 
hlink.setGraphic(new ImageView(image)); 
hlink.setFocusTraversable(false); 
Tab tab = new Tab(); 
tab.setGraphic(hlink); 
hlink.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent e) { 
       //Do somthing 
     } 
}); 
+0

Questo è bello. Ma aggiunge l'immagine prima del titolo della scheda. È possibile aggiungere l'immagine dopo il titolo della scheda? – NaveenBharadwaj

1

Ecco una potenziale soluzione. Se si aggiunge la propria logica "prompt dell'utente" al codice sottostante, dovrebbe fare ciò che si desidera.

package com.test; 

import java.util.Set; 

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class JavaFXApp extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("http://stackoverflow.com/questions/13538227/tab-consuming-in-tabpane-on-default-closing"); 
     BorderPane rootPane = new BorderPane(); 
     Scene scene = new Scene(rootPane, 640, 360, Color.WHITE); 

     TabPane tabPane = new TabPane(); 

     Tab tab1 = new Tab(); 
     tab1.setText("Tab 1"); 
     tabPane.getTabs().add(tab1); 

     Tab tab2 = new Tab(); 
     tab2.setText("Tab 2"); 
     tabPane.getTabs().add(tab2); 

     rootPane.setCenter(tabPane); 
     rootPane.prefHeightProperty().bind(scene.heightProperty()); 
     rootPane.prefWidthProperty().bind(scene.widthProperty()); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     Set<Node> nodes = tabPane.lookupAll(".tab-close-button"); 

     for (final Node node : nodes) { 
      node.setUserData(node.getOnMouseReleased()); 

      node.setOnMouseReleased(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent arg0) { 
        boolean removeTab = false; // prompt the user 

        if (removeTab) { 
         ((EventHandler<MouseEvent>) node.getUserData()).handle(arg0); 
        } 
       } 
      }); 
     } 
    } 
} 
+0

Grazie per la risposta. Ho aggiunto 3 schede in TabPane e dando tabClosingPolicy a "ALL_TABS". Ma ancora Set nodes = tabPane.lookupAll (". Tab-close-button"); Il metodo restituisce il Set vuoto. – Ronak

+1

Sembra che tabPane.lookupAll (". Tab-close-button"); funziona come previsto solo se lo chiami dopo Stage.show(). Stai chiamando lookupAll() prima di chiamare Stage.show()? – ytw

+0

Sì, hai ragione. ma ora 'node.getOnMouseReleased()' dato il valore nullo. – Ronak

1

Scelgo onMousePressed invece di setOnMouseReleased,

E anche la stretta trigger per onMousePressed invece di OnMouseReleased.

6

Il Tab implementazione per Java 8 ha una proprietà onCloseRequest che permette di evitare linguetta di chiusura:

/* The installed event handler can prevent tab closing 
    by consuming the received event. */ 
public void setOnCloseRequest(EventHandler<Event> value)