JavaFX:无装饰窗口

32

我正在尝试制作一个Windows PC的Toast通知。目前我正在使用Swing和JavaFX混合编程,因为我没有找到用FX制作无装饰窗口的方法。我更希望只使用JavaFX。

那么,如何制作一个无装饰窗口呢?

修改: 我已经发现可以直接使用 new Stage(StageStyle.UNDECORATED) 来创建一个窗口。

现在我需要知道如何初始化工具包,以便在我的MyApplication中调用start(Stage stage)方法。(它扩展了Application)

通常我会调用Application.launch(MyApplication.class, null),但这会屏蔽掉我对Stage的创建和Toolkit的初始化。

那么我该怎么做才能让我直接使用 start(new Stage(StageStyle.UNDECORATED)) 呢?


出于安全考虑,这很不可能实现。 - SLaks
2
出于安全考虑?Swing 有这个能力。为什么 JavaFX 会有所不同呢? - Dorothy
因为它在浏览器中运行,可能会被用来伪造系统弹窗。(我对JavaFX知之甚少) - SLaks
4
哦,我的JavaFX应用程序是一个桌面应用程序,它不能在浏览器上运行。但是FX可以在浏览器上运行。 - Dorothy
1个回答

56
我不理解你提前调用start()方法设置一个无装饰的舞台的动机,但以下代码片段应该可以实现你想要的目标。
package decorationtest;

import javafx.application.Application;
import javafx.stage.StageStyle;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class DecorationTest extends Application {

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

    @Override
    public void start(Stage primaryStage) {
        primaryStage.initStyle(StageStyle.UNDECORATED);

        Group root = new Group();
        Scene scene = new Scene(root, 100, 100);

        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

1
它创建了一个未装饰的窗口,但也将其添加到任务栏。我想我需要一个无父级的弹出窗口? - Dorothy
2
这似乎无法在不与Swing混合使用的情况下工作。一个解决方案是为托盘图标制作基于Swing的包装应用程序。 - pmoule
7
@Dorothy 这篇文章非常老旧,但是考虑到未来的读者,我会翻译一下。在 Stage 上调用 initOwner() 并传递对主舞台的引用,可以防止通知的窗口被添加到任务栏中。请注意,这里不做解释。 - Cypher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接