所以这个问题有点棘手。这个类适用于在我的主程序中,我可以为用户可能执行的潜在危险操作生成警告窗口。关于这个窗口的好处是如果用户单击OK,那么它将返回true到我的主类。这可以通过以下方式完成:
private boolean showWarningWindow(String message)
{
ConfirmationBox warning = new ConfirmationBox(message);
warning.showAndWait();
if (warning.isSelected())
{
return true;
}
return false;
}
此方法在我的主GUI类中。问题出在ConfirmationBox
之内。专栏initModality(Modality.APPLICATION_MODAL);
无法正常运作。如果您不小心点击回原来的GUI窗口,那么您已经搞砸了,因为现在您的ConfirmationBox窗口被困在主窗口AND下因为Modality.APPLICATION_MODAL
,您无法点击任何内容把窗户拉回来。您的任务栏上没有单独的应用程序可以让窗口重新聚焦,您甚至无法使用alt-tab来尝试修复它。
显然Modality.APPLICATION_MODAL
可以正常工作,但不知何故它不能建立中断主窗口所需的连接。
在您自己的应用程序中尝试。将showWarningWindow
方法添加到您的应用程序并添加ConfirmationWindow类,您将看到我的意思。我不太确定如何解决这个问题。
package application;
import javafx.beans.property.*;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;
public class ConfirmationBox extends Stage
{
private VBox layout = new VBox();
private ReadOnlyBooleanWrapper selected = new ReadOnlyBooleanWrapper();
public boolean isSelected()
{
return selected.get();
}
public ReadOnlyBooleanProperty selectedProperty()
{
return selected.getReadOnlyProperty();
}
public ConfirmationBox(String question)
{
// Core functionality of the ConfirmationBox.
setTitle("Warning");
initStyle(StageStyle.UTILITY);
initModality(Modality.APPLICATION_MODAL);
setResizable(false);
layout.setSpacing(10);
layout.setPadding(new Insets(10));
createControls();
// Add the Label and Buttons to the Confirmation Box.
layout.getChildren().addAll(new Label(question + "\n\n\n"), createControls());
java.awt.Toolkit.getDefaultToolkit().beep();
setScene(new Scene(layout));
sizeToScene(); // workaround because utility stages aren't automatically sized correctly to their scene.
}
private HBox createControls()
{
final Button ok = new Button("OK");
ok.setOnAction(e -> {
selected.set(true);
close();
});
final Button cancel = new Button("Cancel");
cancel.setOnAction(e -> {
selected.set(false);
close();
});
final HBox controls = new HBox(10, ok, cancel);
controls.setAlignment(Pos.CENTER_RIGHT);
return controls;
}
}