检测舞台何时再次聚焦并加载场景

2024-02-17

我有一个父舞台,可以在其顶部显示弹出窗口。 这是代码:

private static Stage chooseBreedStage;
    static {
        chooseBreedStage = new Stage();
        chooseBreedStage.setTitle("Choose breed");
        chooseBreedStage.initOwner(AppKitty.getStage());
        chooseBreedStage.initModality(Modality.WINDOW_MODAL);
        chooseBreedStage.setScene(SceneManager.getInstance().getScene(SceneEnum.CHOOSE_BREED_SCREEN));
    }

    public void showChooseBreedPopup() {
        chooseBreedStage.showAndWait();
    }

在显示弹出窗口之前,我通过 setEffect() 方法模糊了父节点。 如何消除弹出窗口关闭时的模糊效果?

在我的尝试中,我总是面临问题,尽管弹出窗口已经消失,父屏幕控制器中由 @FXML 注释的元素为空,但它们已经可见并且不会被弹出窗口隐藏

是否有任何监听器可以在舞台未阻塞且场景已加载时处理事件,以便我可以与 @FXML 对象交互?

这是在初级阶段设置的场景控制器的一部分:

        public class MainScreenController {
        private GaussianBlur blur = new GaussianBlur();
            @FXML
            public StackPane mainScreen;
        
            public void blurOn() {
                mainScreen.setEffect(blur);
            }
            public void blurOff() {
                mainScreen.setEffect(null);
            }
        public void makeTestClick(ActionEvent event) {
            blurOn();
           SceneManager.getInstance().getController(ChooseBreedScreenController.class)
                    .showChooseBreedPopup(); 
        }
    }

SceneManager类代码(@Data是lombok注解,可以用getters和setters代替):

public class SceneManager {
    private final Map<SceneEnum, SceneData> sceneData = new HashMap<>();

    @Data
    private class SceneData {
        private Scene scene;
        private FXMLLoader loader;
        private Controller controller;

        SceneData(Scene scene, FXMLLoader loader) {
            setScene(scene);
            setLoader(loader);
            setController(controller);
        }
    }

    private static SceneManager instance = new SceneManager();

    public static SceneManager getInstance() {
        return instance;
    }

    private SceneManager() {
    }

    public <T extends Controller> T getController(Class<T> controllerClass) {
        SceneEnum sceneEnum = getCorrespondingEnum(controllerClass);
        if (sceneData.get(sceneEnum) == null || sceneData.get(sceneEnum).getController() == null) {
            initSceneController(controllerClass);
        }
        return (T) sceneData.get(sceneEnum).getController();
    }

    public Controller getController(SceneEnum sceneEnum) {
        return getController(sceneEnum.getControllerClass());
    }

    private <T extends Controller> void initSceneController(Class<T> controllerClass) {
        try {
            SceneEnum sceneEnum = getCorrespondingEnum(controllerClass);
            if (sceneData.get(sceneEnum) == null) {
                initScene(sceneEnum);
            }
            sceneData.get(sceneEnum).setController(controllerClass.getConstructor().newInstance());
        } catch (Exception e) {
            //todo here should be popup with error
        }
    }

    private <T extends Controller> SceneEnum getCorrespondingEnum(Class<T> controllerClass) {
        Optional<SceneEnum> desiredSceneEnum = Arrays.stream(SceneEnum.values())
                .filter(sceneEnum -> controllerClass.isAssignableFrom(sceneEnum.getControllerClass()))
                .findFirst();
        return desiredSceneEnum.orElseGet(() -> {
            //todo here should be shown popup with error
            return null;
        });
    }

    public Scene getScene(SceneEnum sceneEnum) {
        if (sceneData.get(sceneEnum) == null) {
            initScene(sceneEnum);
        }
        return sceneData.get(sceneEnum).getScene();
    }

    private void initScene(SceneEnum sceneEnum) {
        ConsumerWithException<SceneEnum, IOException> loadingScene = sceneType -> {
            FXMLLoader loader = getFxmlLoader(sceneEnum);
            Scene scene = new Scene(loader.load());
            sceneData.put(sceneEnum, new SceneData(scene, loader));
        };
        try {
            loadingScene.accept(sceneEnum);
        } catch (IOException initializeScreenException) {
            try {
                //Loading app error popup scene, before calling getController() method for
                //this popup, to avoid recursion if loading app error popup scene producing exception as well
                //(it may be in initScene method inside getController method)
                loadingScene.accept(SceneEnum.APP_ERROR_POPUP);
                getController(AppErrorPopupController.class)
                        .showAppErrorPopup(sceneEnum);
            } catch (IOException initializeErrorPopupException) {
                //todo make a better logging
                initializeErrorPopupException.printStackTrace();
            }
        }
    }

    private FXMLLoader getFxmlLoader(SceneEnum scene){
        return new FXMLLoader(this.getClass().getResource(scene.getScenePath()));
    }
}

应用程序基蒂类:

public class AppKitty extends Application {
    private static Stage stage;

    public static Stage getStage() {
        return stage;
    }

    public static void setScene(SceneEnum sceneEnum) {
        getStage().setScene(SceneManager.getInstance()
                        .getScene(sceneEnum));
    }

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

    @Override
    public void start(Stage primaryStage) {
        stage = primaryStage;
        primaryStage.setTitle("AppKitty");
        primaryStage.setScene(SceneManager.getInstance().getScene(SceneEnum.MAIN_SCREEN));
        primaryStage.show();
    }
}

主屏幕.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<?import javafx.geometry.Insets?>
<StackPane xmlns="http://javafx.com/javafx"
           xmlns:fx="http://javafx.com/fxml"
           fx:controller="applicationinterface.controllers.MainScreenController"
           prefHeight="400.0" prefWidth="600.0"
           fx:id="mainScreen"
           stylesheets="@../styles/mainScreenBackground.css"
           id="background_image">

    <Label fx:id="title" text="What do you want?" alignment="TOP_CENTER"
           stylesheets="@../styles/outline.css" styleClass="outline" StackPane.alignment="TOP_CENTER">

    </Label>
    <HBox
            fx:id="bottomBar" id="outline.label" alignment="BOTTOM_CENTER"
            stylesheets="@../styles/outline.css" spacing="20" StackPane.alignment="BOTTOM_CENTER">
        <StackPane.margin>
            <Insets bottom="10"/>
        </StackPane.margin>
        <Button fx:id="randomKittyButton" text="Random Kitty" onAction="#randomKittyClick" focusTraversable="false"
                stylesheets="@../styles/buttonBorder.css" styleClass="button"/>
        <Button fx:id="makeTestButton" text="Take the test" onAction="#makeTestClick" focusTraversable="false"
                stylesheets="@../styles/buttonBorder.css" styleClass="button"/>
    </HBox>
</StackPane>

根据您的代码,您需要在静态块中声明时包含弹出阶段的关闭处理程序。您可以包含以下任何处理程序..(取决于您的需要)

chooseBreedStage.setOnCloseRequest(e1->{
    // Remove blur of AppKitty.getStage()
});

chooseBreedStage.addEventHandler(WindowEvent.WINDOW_HIDDEN,e1->{
    // Remove blur of AppKitty.getStage()
});

chooseBreedStage.addEventFilter(WindowEvent.WINDOW_CLOSE_REQUEST,e1->{
    // Remove blur of AppKitty.getStage()
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测舞台何时再次聚焦并加载场景 的相关文章

随机推荐

  • Jest.js 强制窗口未定义

    我正在使用笑话 酶设置进行测试 如果定义了窗口 我有一个有条件地渲染某些内容的函数 在我的测试套件中 我试图达到第二种情况 即未定义窗口 但我无法强制它 it makes something when window is not defin
  • 如何移除后退堆栈片段的焦点?

    我在我的应用程序中使用片段 我有一个片段包含EditText还有一些Dialogfragment 当我单击一个特定的小部件时 它将移动到下一个片段 我需要后台堆栈中的第一个片段 因此我还添加了 addToBackStack 方法 第二个片段
  • 以图形方式显示 IntelliJ 中 git log --follow 的等效项

    IntelliJ 14 有没有办法显示特定文件的完整日志 我的意思是 执行一种git log follow以图形方式查看旧版本 在这些文件可能被重命名之前 目前 当我这样做时Git gt 显示历史记录在文件上 它仅显示相当于git log
  • 不带任何操作的 asp.net 路由语法

    我正在尝试建立一条没有任何操作而只有一个参数的路线 domain com 不带任何参数 应转到一个控制器 however 域名 com somestring 域名 com anotherstring 域名 com anythingreall
  • 将 uint16_t 转换为 char[2] 以通过套接字发送(unix)

    我知道大致上有关于这方面的事情 但是我的大脑受伤了 我找不到任何东西可以让这项工作发挥作用 我正在尝试通过 unix 套接字发送一个 16 位无符号整数 为此 我需要将 uint16 t 转换为两个字符 然后我需要在连接的另一端读入它们并将
  • 系统设置意图后无法返回活动

    在我的应用程序中 我需要进入手机的设置活动来激活 GPS 并希望使用以下代码返回我的应用程序 Intent intent new Intent Settings ACTION LOCATION SOURCE SETTINGS startAc
  • 仅包含标准库的 Golang 中间件

    我的第一个 stackoverflow 问题 所以请不要介意我对 stackoverflow 的天真和所问的问题 golang 的初学者 我想知道这两个调用之间的区别以及简单的理解Handle Handler HandleFunc Hand
  • 将列名添加到 dplyr 函数内的 vars()

    我有一个函数 可用于根据一些用户定义的组来汇总变量 利用dplyr library tidyverse get var summary lt function data target var group vars vars target v
  • ggplot2 分类x轴的不同面宽度[重复]

    这个问题在这里已经有答案了 我正在绘制分类数据的不同方面 df lt as data frame as factor c A B C D E F names df lt Xvar df Yvar lt c 2 1 4 5 3 7 df fa
  • 我可以使用什么方法来代替 python 中的 __file__ ?

    我通过 cython 将 python 代码转换为 c 然后编译 c 文件并在我的项目中使用 so 我的问题 我用 file 在我的 python 代码和 gcc 编译时 它不会出现错误 但是当我运行程序并在其他 python 文件中导入
  • 将 R闪亮应用程序部署为独立应用程序[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我开发了一个 RShiny 应用程序 我想与我的同事在内部共享 现阶段无法在服务器上托管该应用程序 我正
  • Webkit 伪元素文档

    我实际上完成了我想做的事情 当我想打印页面时隐藏一些 webkit 伪元素 代码如下所示 问题是我没有从我的研究中学到任何东西来做到这一点 而且我找不到任何关于它的文档 而且我看到的关于这个主题的每个答案都只显示了代码 没有任何进一步的解释
  • 优雅关闭失败

    我有一个带有 server shutdown graceful 的 spring boot 2 3 应用程序 当关闭时会抛出 2020 11 30 11 07 35 485 WARN 3038 SpringContextShutdownHo
  • SQL 存储过程 - 请帮我写这个! (第2部分)

    我有下表 其中值为 501 CREATE TABLE Numbers Number numeric 20 0 NOT NULL PRIMARY KEY INSERT INTO Numbers VALUES 501 我如何在此上编写一个存储过
  • 在 Java/Swing 的全屏程序中停止使用 Tab/Alt-F4

    我需要一种方法来阻止人们在我的 Java 程序运行时使用其他程序 即阻止人们切换选项卡并按 Alt F4 使程序全屏使用 window setExtendedState Frame MAXIMIZED BOTH maximise windo
  • C# ASCII 或 Unicode

    您好 我是编程和网络开发的初学者 我有一个关于 ASCII 和 Unicode 编码的问题 在 msdn 和其他 Web 示例中执行以下操作 byte byteData Encoding ASCII GetBytes data 这是因为这些
  • 如何将 Google Cloud AI Platform Jupyter Lab 升级到 Python 3.7+

    Google Cloud Platform的AI Platform可以方便地部署Jupyter Lab 但仅适用于Python 2和Python 3 5 3 如何升级我的实例才能运行 Python 3 7 或更高版本 笔记本 该解决方案是基
  • 在 Visual Studio 2012 的新 C++ 项目中自动创建的 stdafx.cpp 文件是什么

    据我了解 stdafx h 是一个预编译头文件 用于使 Visual Studio 中的编译时间更快 当我在 Visual Studio 2012 中创建 C 项目时 还有一个 stdafx cpp 有人可以解释 stdafx h 和 st
  • 将配置文件共享给多个 docker 容器

    假设我的 Docker 主机上有以下配置文件 并且我希望多个 Docker 容器能够访问该文件 opt shared config file yml 在典型的非 Docker 环境中 我可以使用符号链接 例如 opt app1 config
  • 检测舞台何时再次聚焦并加载场景

    我有一个父舞台 可以在其顶部显示弹出窗口 这是代码 private static Stage chooseBreedStage static chooseBreedStage new Stage chooseBreedStage setTi