弹出窗口卡在主窗口后面 - JavaFX

时间:2016-01-06 00:52:49

标签: java javafx window

所以这个问题有点棘手。这个类适用于在我的主程序中,我可以为用户可能执行的潜在危险操作生成警告窗口。关于这个窗口的好处是如果用户单击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;
    }
}

0 个答案:

没有答案