有没有办法在 JavaFX中获得当前打开的Stage,如果有一个打开的话?

像这样的东西:

Stage newStage = new Stage();
newStage.initOwner(JavaFx.getCurrentOpenedStage()); //Like this

解决方法

这没有内置功能.在大多数用例中,由于用户操作而打开一个新的Stage,因此可以在发生操作的节点上调用getScene().getwindow()以获取“当前”窗口.

在其他用例中,您必须编写代码来自己跟踪当前窗口.当然,多个窗口可能是打开的,因此您需要在某种集合中跟踪它们.我建议创建一个工厂类来管理阶段并为阶段的打开和关闭注册事件处理程序,这样您就可以更新属性和/或列表.你可能希望这是一个单身人士.这是一个示例实现:这里getopenStages()给出一个可观察的开放阶段列表 – 最后一个是最近打开的 – 而currentStageproperty()给出了焦点阶段(如果有的话).您的确切实施可能会有所不同,具体取决于您的确切需求.

public enum StageFactory {
    INSTANCE ;

    private final ObservableList<Stage> openStages = FXCollections.observableArrayList();

    public ObservableList<Stage> getopenStages() {
        return openStages ;
    }

    private final ObjectProperty<Stage> currentStage = new SimpleObjectProperty<>(null);
    public final ObjectProperty<Stage> currentStageproperty() {
        return this.currentStage;
    }
    public final javafx.stage.Stage getCurrentStage() {
        return this.currentStageproperty().get();
    }
    public final void setCurrentStage(final javafx.stage.Stage currentStage) {
        this.currentStageproperty().set(currentStage);
    }

    public void registerStage(Stage stage) {
        stage.addEventHandler(WindowEvent.WINDOW_SHOWN,e -> 
                openStages.add(stage));
        stage.addEventHandler(WindowEvent.WINDOW_HIDDEN,e -> 
                openStages.remove(stage));
        stage.focusedproperty().addListener((obs,wasFocused,isNowFocused) -> {
            if (isNowFocused) {
                currentStage.set(stage);
            } else {
                currentStage.set(null);
            }
        });
    }

    public Stage createStage() {
        Stage stage = new Stage();
        registerStage(stage);
        return stage ;
    }

}

请注意,这只允许您跟踪从StageFactory.INSTANCE.createStage()获取的阶段或在别处创建并传递给StageFactory.INSTANCE.registerStage(…)方法的阶段,因此您的代码必须与该要求协作.另一方面,它使您有机会集中初始化阶段的代码,这可能是有益的.

这是一个使用它的简单示例:

import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class SceneTrackingExample extends Application {

    int count = 0 ;

    @Override
    public void start(Stage primaryStage) {
        StageFactory factory = StageFactory.INSTANCE ;
        factory.registerStage(primaryStage);

        configureStage(primaryStage);
        primaryStage.show();
    }

    private void configureStage(Stage stage) {
        StageFactory stageFactory = StageFactory.INSTANCE;
        Stage owner = stageFactory.getCurrentStage() ;
        Label ownerLabel = new Label();
        if (owner == null) {
            ownerLabel.setText("No owner");
        } else {
            ownerLabel.setText("Owner: "+owner.getTitle());
            stage.initOwner(owner);
        }
        stage.setTitle("Stage "+(++count));
        Button newStage = new Button("New Stage");
        newStage.setonAction(e -> {
            Stage s = stageFactory.createStage();
            Stage current = stageFactory.getCurrentStage() ;
            if (current != null) {
                s.setX(current.getX() + 20);
                s.setY(current.getY() + 20);
            }
            configureStage(s);
            s.show();
        });

        VBox root = new VBox(10,ownerLabel,newStage);
        root.setAlignment(Pos.CENTER);
        stage.setScene(new Scene(root,360,150));
    }

    public enum StageFactory {
        INSTANCE ;

        private final ObservableList<Stage> openStages = FXCollections.observableArrayList();

        public ObservableList<Stage> getopenStages() {
            return openStages ;
        }

        private final ObjectProperty<Stage> currentStage = new SimpleObjectProperty<>(null);
        public final ObjectProperty<Stage> currentStageproperty() {
            return this.currentStage;
        }
        public final javafx.stage.Stage getCurrentStage() {
            return this.currentStageproperty().get();
        }
        public final void setCurrentStage(final javafx.stage.Stage currentStage) {
            this.currentStageproperty().set(currentStage);
        }

        public void registerStage(Stage stage) {
            stage.addEventHandler(WindowEvent.WINDOW_SHOWN,e -> 
                    openStages.add(stage));
            stage.addEventHandler(WindowEvent.WINDOW_HIDDEN,e -> 
                    openStages.remove(stage));
            stage.focusedproperty().addListener((obs,isNowFocused) -> {
                if (isNowFocused) {
                    currentStage.set(stage);
                } else {
                    currentStage.set(null);
                }
            });
        }

        public Stage createStage() {
            Stage stage = new Stage();
            registerStage(stage);
            return stage ;
        }

    }

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

如何在JavaFX中获得当前打开的阶段?的更多相关文章

  1. 如何在swift中使用NSCoder编码枚举?

    背景我试图使用NSCoding协议编码一个字符串样式的枚举,但我遇到错误转换和返回从字符串。解码和编码时,我得到以下错误:字符串不能转换为Stage额外参数ForKey:在调用码您需要将枚举转换为和从原始值。在Swift1.2中,这将是这样:Swift1.1,使用as而不是!!Swift1.0使用toRaw()和fromraw()像这样:

  2. centos – grubby致命错误:无法找到合适的模板

    在将系统从一台服务器移动到另一台服务器之后,我正在尝试修复我的系统.它与通过网络启动的内核完美配合,但不能从磁盘启动.重新安装库存CentOS6.6内核显示此错误:我的/boot/grub/grub.conf文件看起来很好:所有文件都到位:/etc/fstab看起来也很好:怎么解决这个?有点迟到的响应,但是在CentOS7最小安装时遇到了同样的问题.解决方案是在升级内核后运行:grub2-mkco

  3. PHP中的脸部检测

    有没有人知道在PHP中进行面部检测的好办法?使用较低级代码编写的OpenCV可能会更容易/更安全.PHP被解释,所以在做这个工作时可能会很慢.希望这可以帮助!

  4. CentOS 6开机启动流程实验篇

    CentOS6开机启动流程实验篇centos系统的启动流程grub破坏Linux的核心文件再修复体验系统启动流程CentOS6开机启动的具体详情请参见理论篇!接下来开始实验,建议提前备份相关文件或给系统先做快照!进入之前如果提示chroot/mnt/sysimage,则表示/etc/fstab文件是正常的.2.破坏MBR之后的扇区,即stage1-5重启:发现屏幕一直卡在了黑色界面好吧,手动进入救援模式然后重建grub!重建grub后可查看/dev/sda上的前1024字节此时重启系统就正常启动了!

  5. Centos6系统启动详解......

    stage1_5通常位于stage1字段后的63个扇区由于stage2在内存中存放可以使用的文件系统不确定,所以这就是有多个stage1_5的原因。

  6. CentOS 6.6 系统剪裁

    一:前言本文主要通过裁剪现有Linux系统,打造一个属于自己的Linux小系统,让其能够装载网卡驱动,并配置IP地址,实现网络功能。

  7. ios – 如何区分iTunes Connect / Apple TestFlight上的STAGE和PRODUCTION构建?

    我们有脚本可以自动上传到iTunesConnect,这样就可以解决一些问题.但基本上,在大多数情况下,要记录所有指向的内容,这是一个很大的困难.

  8. 如何在JavaFX中获得当前打开的阶段?

    有没有办法在JavaFX中获得当前打开的Stage,如果有一个打开的话?)方法的阶段,因此您的代码必须与该要求协作.另一方面,它使您有机会集中初始化阶段的代码,这可能是有益的.这是一个使用它的简单示例:

  9. javascript – 如何在没有Stage的情况下使用pixi.js?

    我有这个pixi.js代码,它做了它应该做的事情:绘制一个矩形.但是,在控制台中我得到了声明如果不使用PIXI.Stage(),我该如何做同样的事情?解决方法我其实刚遇到同样的问题!我最终找到了PIXI的新文档,可以在这里找到http://pixijs.github.io/docs/index.html.它们引用的容器是为替换Stage对象而引入的新对象.http://pixijs.github.io/docs/PIXI.Container.html#toc1stage=newPIXI.StageNowb

  10. javascript – 无法通过npm脚本运行babel“babel:command not found”

    我可能会错过一个babelnpm文件吗?“babelsrc-ddist”不正确吗?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部