2012-11-24 22 views
7

Tôi đã tạo chương trình mà trong đó tôi đã tạo TabPane, trong đó có nhiều Tab. Tôi muốn làm điều đó khi ai đó cố gắng đóng bất kỳ Tab nào, Sau đó tôi muốn thực thi mã của riêng mình. tức là khi người dùng nhấp vào nút đóng mặc định cho bất kỳ Tab nào, thì nó sẽ yêu cầu xác nhận. Nếu người dùng nói "Có" thì tab sẽ bị đóng nếu không tab sẽ vẫn mở.Tab tiêu thụ trong TabPane theo mặc định đóng

Tôi làm cách nào để thực hiện việc này?

Tôi đang làm một việc như dưới đây. nhưng vẫn đang đóng cửa. Làm thế nào tôi sẽ tiêu thụ 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(); 
      } 
     }); 

Trả lời

4

Tôi đang theo cách riêng của mình như được đưa ra bên dưới.
Tôi đã tạo một siêu liên kết và đặt nó làm đồ họa cho Tab đó và công việc của nó tốt cho tôi.

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

Điều này thật tuyệt. Nhưng nó đang thêm đồ họa trước tiêu đề tab. Có thể thêm đồ họa sau tiêu đề tab không? – NaveenBharadwaj

1

Đây là giải pháp tiềm năng. Nếu bạn thêm logic "nhắc người dùng" của riêng mình vào mã bên dưới, nó sẽ làm những gì bạn muốn.

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

Cảm ơn bạn đã trả lời. Tôi đã thêm 3 tab trong TabPane và cho tabClosingPolicy thành "ALL_TABS". Nhưng vẫn còn Đặt nodes = tabPane.lookupAll (". Tab-close-button"); Phương thức trả về Tập trống. – Ronak

+1

Dường như tabPane.lookupAll (". Tab-close-button"); chỉ hoạt động như mong đợi nếu bạn gọi nó sau Stage.show(). Bạn đang gọi tra cứuAll() trước khi gọi Stage.show()? – ytw

+0

Có, bạn đã đúng. nhưng bây giờ 'node.getOnMouseReleased()' đã cho giá trị null. – Ronak

1

Thay đổi để onMousePressed thay vì setOnMouseReleased,

Và cũng đóng cửa gây nên để onMousePressed thay vì OnMouseReleased.

6

Việc thực hiện Tab cho Java 8 có một đặc tính cho phép bạn ngăn chặn tab đóng onCloseRequest:

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