问题描述
在 JavaFX 中关闭窗口时遇到问题.
I have trouble when closing a window in JavaFX.
我根据需要定义了我的 setOnCloseRequest
,当我单击窗口中的 x 时它会起作用.但是,我还需要一个按钮来关闭窗口,而这个 onCloseRequest
必须起作用,但问题是它不起作用.该事件根本不会触发.
I define my setOnCloseRequest
as I wanted and it works when I click the x in the window. However, I also need a button to close the window and this onCloseRequest
has to work, the problem is it does not. The event does not fire at all.
我使用的是 JavaFX 2.2 (Java 7),我注意到 setOnCloseRequest
的参考说关闭 外部请求
I am using JavaFX 2.2 (Java 7) and I notice that the reference for setOnCloseRequest
says close the window on external request
推荐答案
解决方案
从您的内部关闭请求(按下按钮时)触发一个事件,以便应用程序认为它收到了外部关闭请求.那么无论请求来自外部事件还是内部事件,您的关闭请求逻辑都可以相同.
Fire an event from your internal close request (on the button push), so that the application thinks it received an external close request. Then your close request logic can be identical whether the request came from an external event or an internal one.
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.
This is a Java 8+ solution, for JavaFX 2, you will need to convert the lambda functions in anonymous inner classes and will be unable to use the Alert dialog box but will need to provide your own alert dialog system as JavaFX 2 does not feature an in-built one. I strongly recommend upgrading to Java 8+ rather than staying with JavaFX 2.
示例界面
示例代码
示例代码将向用户显示关闭确认警报,如果用户不确认关闭,则取消关闭请求.
The sample code will show the user a close confirmation alert and cancel the close request if the user does not confirm the close.
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);
}
}
这篇关于如何触发内部关闭请求?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!