7

I have created a program in which a TabPane contains multiple Tabs. When someone tries to close any Tab, I want to execute my own code: when a user clicks on the default close button for any Tab, it will ask for confirmation. If the user says "Yes" then the tab will be closed, otherwise it will remain open.

How can I do this?

I am doing something like below. but the Tab is still getting closed. How would I consume that 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

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

onMousePressedの代わりに にsetOnMouseReleased変更します。

また、閉じるトリガーはonMousePressed代わりにOnMouseReleased.

于 2013-02-22T00:38:01.387 に答える
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 に答える