gpt4 book ai didi

java - 如何触发内部关闭请求?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:00 25 4
gpt4 key购买 nike

在 JavaFX 中关闭窗口时遇到问题。

我根据需要定义我的 setOnCloseRequest,当我点击窗口中的 x 时它会起作用。但是,我还需要一个按钮来关闭窗口并且此 onCloseRequest 必须起作用,但问题是它不起作用。该事件根本不会触发。

我正在使用 JavaFX 2.2 (Java 7),我注意到 setOnCloseRequest 的引用说明在外部请求

上关闭窗口

最佳答案

解决方案

从您的内部关闭请求(在按下按钮时)触发一个事件,以便应用程序认为它收到了外部关闭请求。然后,无论请求来自外部事件还是内部事件,您的关闭请求逻辑都可以相同。

private EventHandler<WindowEvent> confirmCloseEventHandler = event -> {
// close event handling logic.
// consume the event if you wish to cancel the close operation.
}

...

stage.setOnCloseRequest(confirmCloseEventHandler);

Button closeButton = new Button("Close Application");
closeButton.setOnAction(event ->
stage.fireEvent(
new WindowEvent(
stage,
WindowEvent.WINDOW_CLOSE_REQUEST
)
)
);

注意

这是一个 Java 8+ 解决方案,对于 JavaFX 2,您将需要转换匿名内部类中的 lambda 函数,并且将无法使用警报对话框,但需要像 JavaFX 2 一样提供您自己的警报对话框系统没有内置功能。我强烈建议升级到 Java 8+ 而不是继续使用 JavaFX 2。

示例用户界面

close app

close confirm

示例代码

示例代码将向用户显示关闭确认提示,如果用户未确认关闭,则取消关闭请求。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.StackPane;
import javafx.stage.*;
import javafx.stage.WindowEvent;

import java.util.Optional;

public class CloseConfirm extends Application {

private Stage mainStage;

@Override
public void start(Stage stage) throws Exception {
this.mainStage = stage;
stage.setOnCloseRequest(confirmCloseEventHandler);

Button closeButton = new Button("Close Application");
closeButton.setOnAction(event ->
stage.fireEvent(
new WindowEvent(
stage,
WindowEvent.WINDOW_CLOSE_REQUEST
)
)
);

StackPane layout = new StackPane(closeButton);
layout.setPadding(new Insets(10));

stage.setScene(new Scene(layout));
stage.show();
}

private EventHandler<WindowEvent> confirmCloseEventHandler = event -> {
Alert closeConfirmation = new Alert(
Alert.AlertType.CONFIRMATION,
"Are you sure you want to exit?"
);
Button exitButton = (Button) closeConfirmation.getDialogPane().lookupButton(
ButtonType.OK
);
exitButton.setText("Exit");
closeConfirmation.setHeaderText("Confirm Exit");
closeConfirmation.initModality(Modality.APPLICATION_MODAL);
closeConfirmation.initOwner(mainStage);

// normally, you would just use the default alert positioning,
// but for this simple sample the main stage is small,
// so explicitly position the alert so that the main window can still be seen.
closeConfirmation.setX(mainStage.getX());
closeConfirmation.setY(mainStage.getY() + mainStage.getHeight());

Optional<ButtonType> closeResponse = closeConfirmation.showAndWait();
if (!ButtonType.OK.equals(closeResponse.get())) {
event.consume();
}
};

public static void main(String[] args) {
launch(args);
}

}

关于java - 如何触发内部关闭请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29710492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com