我创建了一个程序,其中 TabPane 包含多个标签。 当有人试图关闭任何Tab时,我想执行我自己的代码:当用户点击任何Tab的默认关闭按钮时,它会要求确认。 如果用户说“是”,则选项卡将关闭,否则它将保持打开状态。
我该怎么做?
我正在做类似下面的事情。 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();
}
});
答案 0 :(得分:8)
Java 8的Tab
实现具有onCloseRequest
属性,允许您阻止标签关闭:
/* The installed event handler can prevent tab closing
by consuming the received event. */
public void setOnCloseRequest(EventHandler<Event> value)
答案 1 :(得分: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
}
});
答案 2 :(得分: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);
}
}
});
}
}
}
答案 3 :(得分:1)
更改为onMousePressed
而不是setOnMouseReleased
,
此外还有onMousePressed
而不是OnMouseReleased
的关闭触发器。