我最近就OSX问了一个类似的问题,并找到了使用com.sun.glass包的解决方案。但是,此解决方案似乎不适用于基于X11的桌面环境。
问题: 我正在尝试编写一个无边框窗口覆盖,可以放在所有其他桌面组件上方,包括使用x11的任何给定Linux桌面环境的dock和菜单栏。目前,当我在我的JavaFX窗口中使用AlwaysOnTop(true)时,窗口被放置在所有其他窗口之上,但由于它具有更高的窗口级别而未被放置在窗口管理器UI(任务栏)之上。下面的屏幕截图显示了使用AlwaysOnTop时会发生什么:整个垂直白色窗口应该放在任务栏上方,而是强制在它下面。请参见屏幕截图:
通过使用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();
}
}