2012-11-24 63 views
7

我已經創建了一個程序,我在其中創建了一個TabPane,其中有多個標籤。 我想這樣做當有人試圖關閉任何選項卡,然後我想執行我自己的代碼。即當用戶點擊任何標籤的默認關閉按鈕時,它會要求確認。如果用戶說「是」,那麼標籤將被關閉,否則它將保持打開狀態。默認關閉TabPane中的Tab消費

我怎樣才能做到這一點?

我做喜歡的東西下面。但仍然關閉。我將如何消費該標籤?

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

回答

4

我得到我自己的方式如下。
我創建了一個超鏈接並將其設置爲該選項卡的圖形,並且其工作適合我。

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

這很酷。但它是在標題標題之前添加圖形。是否可以在標籤標題之後添加圖形? – NaveenBharadwaj

1

這裏有一個潛在的解決方案。 如果您將自己的「提示用戶」邏輯添加到下面的代碼中,它應該執行您想要的操作。

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

感謝您的答覆。 我已經添加在TabPane 3個選項卡,並給予tabClos​​ingPolicy爲「ALL_TABS」。但仍然 設置 nodes = tabPane.lookupAll(「。tab-close-button」); 方法返回空Set。 – Ronak

+1

看來,tabPane.lookupAll(「。tab-close-button」);只有在Stage.show()之後調用它纔會如預期的那樣工作。在調用Stage.show()之前調用lookupAll()嗎? – ytw

+0

是的,你是對的。但現在'node.getOnMouseReleased()'給出空值。 – Ronak

1

更改爲onMousePressed,而不是setOnMouseReleased

而且也接近觸發到onMousePressed,而不是OnMouseReleased

6

Tab實現對Java 8有一個onCloseRequest財產,可以防止標籤收盤:

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