【问题标题】:Tab consuming in TabPane on default closing默认关闭时 TabPane 中的 Tab 消耗
【发布时间】:2012-11-24 04:20:06
【问题描述】:

我创建了一个程序,其中一个 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();
            }
        });

【问题讨论】:

    标签: java tabs event-handling javafx-2 javafx


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      下面给出了我自己的方式。
      我创建了一个超链接并将其设置为该选项卡的图形,它对我来说很好。

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

      【讨论】:

      • 这很酷。但它是在标签标题之前添加图形。是否可以在标签标题后添加图形?
      【解决方案3】:

      这是一个潜在的解决方案。 如果您将自己的“提示用户”逻辑添加到下面的代码中,它应该会执行您想要的操作。

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

      【讨论】:

      • 感谢您的回复。我在 TabPane 中添加了 3 个选项卡,并将 tabClos​​ingPolicy 赋予 "ALL_TABS" 。但仍然 Set nodes = tabPane.lookupAll(".tab-close-button");方法返回空集。
      • 好像 tabPane.lookupAll(".tab-close-button");只有在 Stage.show() 之后调用它才能按预期工作。你是在调用 Stage.show() 之前调用 lookupAll() 吗?
      • 是的,你是对的。但现在node.getOnMouseReleased() 给出了空值。
      • 也许你的代码和上面的示例代码还是有一些区别的。当您运行上面的示例代码时,您是否能够通过将 removeTab 布尔值设置为 false/true 来禁用/启用选项卡关闭?
      • 是的,我做的和你上面给出的一样。 boolean removeTab = false; if (removeTab) { ((EventHandler&lt;MouseEvent&gt;) node.getUserData()).handle(arg0); } 但标签仍然关闭。但我认为当removeTab值为false时,它不应该关闭标签。
      【解决方案4】:

      改为onMousePressed,而不是setOnMouseReleased

      还有关闭触发器到onMousePressed 而不是OnMouseReleased

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-18
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多