7

我创建了一个程序,其中TabPane包含多个Tabs。当有人试图关闭任何选项卡时,我想执行我自己的代码:当用户单击任何选项卡的默认关闭按钮时,它会要求确认。如果用户说“是”,则选项卡将关闭,否则将保持打开状态。

我怎样才能做到这一点?

我正在做类似下面的事情。但选项卡仍在关闭。我将如何使用该选项卡?

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

4 回答 4

9

Java 8的Tab实现有一个onCloseRequest属性可以防止标签关闭:

/* The installed event handler can prevent tab closing 
   by consuming the received event. */
public void setOnCloseRequest(EventHandler<Event> value)
于 2013-02-22T19:46:15.853 回答
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
         }
});
于 2012-12-05T04:57:23.203 回答
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);
                    }
                }
            });
        }
    }
}
于 2012-11-24T14:45:18.440 回答
1

改为,onMousePressed而不是setOnMouseReleased

并且关闭触发器onMousePressed代替OnMouseReleased.

于 2013-02-22T00:38:01.387 回答