(Linux)允许JavaFX AlwaysOnTop窗口绕过x11窗口管理器

时间:2017-07-29 13:35:28

标签: java linux javafx-8 overlay x11

我最近就OSX问了一个类似的问题,并找到了使用com.sun.glass包的解决方案。但是,此解决方案似乎不适用于基于X11的桌面环境。

问题: 我正在尝试编写一个无边框窗口覆盖,可以放在所有其他桌面组件上方,包括使用x11的任何给定Linux桌面环境的dock和菜单栏。目前,当我在我的JavaFX窗口中使用AlwaysOnTop(true)时,窗口被放置在所有其他窗口之上,但由于它具有更高的窗口级别而未被放置在窗口管理器UI(任务栏)之上。下面的屏幕截图显示了使用AlwaysOnTop时会发生什么:整个垂直白色窗口应该放在任务栏上方,而是强制在它下面。请参见屏幕截图:enter image description here

通过使用x11bypasswindowmanager窗口标志,Qt有一个解决这个问题的方法,所以我认为必须通过Java才能实现!

我目前唯一的解决方案是使用子进程直接通过命令行使用wmctrl。这不太合适,因为很多linux系统都没有安装wmctrl。

以下是我用于在上面的屏幕截图中生成窗口的代码段:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        StackPane root = new StackPane();
        primaryStage.setScene(new Scene(root, 200, 3000));
        primaryStage.setAlwaysOnTop(true);
        primaryStage.initStyle(StageStyle.UNDECORATED);
        primaryStage.setX(800);
        primaryStage.setY(0);
        primaryStage.show();
    }
}

0 个答案:

没有答案