【问题标题】:JavaFX: Getting Stage of running ApplicationsJavaFX:运行应用程序的获取阶段
【发布时间】:2015-08-15 04:22:48
【问题描述】:

为了使用 TestFX 测试应用程序,我需要获取正在运行的应用程序的实际主要阶段。这意味着我没有代码,我可以通过一个 jar 来运行应用程序。

有什么可能的解决方案吗? Scenic View 已经这样做了,但我无法重现此功能,尤其是因为它们似乎使用了已弃用的功能

Windows.impl_getWindows

这在我的情况下不起作用。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    试试这个:

    import com.sun.javafx.robot.impl.FXRobotHelper;
    
    static Collection<Stage> getAllJavaFXStages() {
        try {
            return FXRobotHelper.getStages();
        } catch ( NullPointerException npe ) {
            // nasty NPE if no stages exist
            return Collections.emptyList();
        }
    }
    

    ```

    基于我自己的测试框架代码:Automaton.

    编辑

    如果您想从与运行代码的位置不同的 JVM 实例获取 Stage,那么没有简单的方法。

    你说得对,ScenicView 做到了,但它使用 tools.jar 做到了。这不是您在运行时获得的标准 jar,因此您必须手动添加它(将其放在 jre/lib/ext 中应该可以做到,您通常只能在 lib 中找到它)。

    我在他们的BitBucket repo. 中找到了 ScenicView 似乎正在执行此操作的代码

    例如检查函数getRunningJavaFXApplications

    在你的测试中使用它很有趣!

    【讨论】:

    • 依赖com.sun 类不是很好,但是对于这种你需要的不受支持的功能(能够测试东西),这是 AFAIK 的唯一方法。
    • 对于感兴趣的读者,有一些关于perils of using com.sun here 的背景讨论(并不是说我有更好的解决方案)。
    • 我认为使用 Window.impl_getWindows() 和您的建议,您只能在同一个 JVM 中获得应用程序启动的阶段。但我的问题是,该应用程序正在另一个 JVM 中运行。
    • 如果有人能了解 ScenicView 是如何做到的,那就太好了!在他们的文档中,他们提到您需要 tools.jar 来进行自动发现(它包含 JDK 内部类,这些类可以帮助 IDE 和 JVM 监控等工具)......所以这绝对是一些工具的魔力。
    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 2014-12-24
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多