Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JavaFX窗口配置为浮动在Mac OSX Dock/Menubar上?_Java_Macos_Javafx_Overlay - Fatal编程技术网

如何将JavaFX窗口配置为浮动在Mac OSX Dock/Menubar上?

如何将JavaFX窗口配置为浮动在Mac OSX Dock/Menubar上?,java,macos,javafx,overlay,Java,Macos,Javafx,Overlay,我试图在MacOSX上创建一个透明的无边界JavaFX窗口/覆盖,允许用户通过绘制一个矩形然后截屏来选择屏幕的一个区域 为了在OSX上实现这一点,我必须以某种方式将JavaFX窗口配置为浮动在MacOSX Dock/Menubar上,因为默认情况下,窗口会自动强制位于这两个窗口的下方。我的意思是,我不能将窗口拖到dock或菜单栏上,因为它被强制放置在窗口下方,因此很难实现正确的覆盖 如何通过Cocoa配置类似于NSWindow级别的JavaFX窗口级别 下面的截图(摘自一篇类似的电子相关文章)突

我试图在MacOSX上创建一个透明的无边界JavaFX窗口/覆盖,允许用户通过绘制一个矩形然后截屏来选择屏幕的一个区域

为了在OSX上实现这一点,我必须以某种方式将JavaFX窗口配置为浮动在MacOSX Dock/Menubar上,因为默认情况下,窗口会自动强制位于这两个窗口的下方。我的意思是,我不能将窗口拖到dock或菜单栏上,因为它被强制放置在窗口下方,因此很难实现正确的覆盖

如何通过Cocoa配置类似于NSWindow级别的JavaFX窗口级别

下面的截图(摘自一篇类似的电子相关文章)突出了这个问题以及我的目标:

当前结果:

预期结果:

多亏了他的建议,我决定研究如何将基本JavaFX窗口的级别设置为MacOSX允许的最大值。下面的代码片段显示了使用com.sun.glass.ui.Window覆盖给定窗口句柄/对象的窗口级别是多么容易,可以使用找到该句柄/对象。由于在另一个StackOverflow页面中找到了,我了解了如何使用glass.ui.Window

但是,有一个小小的缺点(但对我个人来说不是问题):即使设置了最大窗口级别,装饰过的窗口也不能放置在菜单栏上方,但是,它们仍然可以放置在dock上方。如果要在菜单栏上方设置窗口,必须首先将其设置为“未装饰”,显示它,使用com.sun.glass.ui.getWindows().get(窗口索引)抓取窗口,然后将窗口级别设置为3(最大值)。您可以在此之前或之后设置窗口的X和Y坐标,这似乎是双向的

OSX解决方案代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class ontopTest extends Application{

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

    @Override
    public void start(final Stage stage){
        Scene scene = new Scene(new Pane(new Label("test application")));
        stage.setTitle("Override OSX Menubar test");
        // Decorated window results in our window being placed below menubar even after setting window level to max.
        stage.initStyle(StageStyle.UNDECORATED);
        // An undecorated window fixes this and can be placed above the menubar.
        stage.setWidth(300);
        stage.setHeight(300);
        stage.setScene(scene);
        // stage.setAlwaysOnTop uneeded as com.sun.glass.ui sets window to top
        stage.setY(0); // Set Y Axis to 0
        // Need to show window first
        stage.show();
        // Print all windows running in current process
        System.out.println(com.sun.glass.ui.Window.getWindows());
        // Select which window to set level (window at index 0 in this case)
        com.sun.glass.ui.Window.getWindows().get(0).setLevel(3);
        // Set window level to 3 (Maximum)
    }
}
编辑:虽然我可以确认这在Mac OSX Sierra上有效,但我也在Arch Linux w/KDE Plasma上测试过,这种设置最大窗口级别的方法在该平台上不起作用。它只是将窗口设置为“AlwaysOnTop”模式,但仍将在KDE/X11菜单栏下强制执行。我知道(到目前为止)在Linux系统上绕过X11菜单栏的唯一解决方案是通过输入以下命令使用:

通过按窗口标题选择窗口,将窗口添加到最顶层。这也会将窗口设置为AlwaysOnTop

wmctrl -r "Window Title" -b add,above
将窗户(装饰的或未装饰的)定位到您想要的(以前限制的)区域,例如菜单栏、码头等上方

wmctrl -r "Window Title" -e 0,x,y,width,height

如果您有一个基于Java的X11解决方案,可以在菜单栏/停靠点上设置未装饰的窗口,请共享

你能提供用于生成当前结果的代码吗?我觉得实现这一点的唯一方法是编写一些本机代码,并操纵当前结果。我认为您不会在公共JavaFX API中找到任何直接支持此功能的东西。有一些代码可以实现这一点,它有一个
setLevel(Level.topmest)
方法,这是“一个非常顶级的窗口级别。可能涵盖系统UI元素,如dock、taskbar等”。由于该类在
com.sun
层次结构中是包私有的,因此它不是公共API(因此不受直接支持,在未来的Java版本中可能无法工作),我不知道如何从应用程序调用该功能。我注意到,单击绿色展开菱形会覆盖整个屏幕,因此,可以尝试调用.jewelsea的
Application::requestToggleFullScreen
——演示如何构建窗口本身。它在windows上运行得非常好,但是,在我这边,它被强制放在OSX菜单栏/Dock后面:我将查看com.sun.glass.ui.Window,谢谢。它是否与JavaFXStage兼容?垃圾神-我需要避免任何形式的“全屏”初始化,以便覆盖可以分布在所有监视器上。如果我在OSX上强制全屏显示,一个新的工作区将以黑色背景打开,使得透明覆盖层毫无用处。这种黑客行为将始终依赖于平台。请小心使用com.sun.*软件包,因为它们可能会在没有警告或适当文档的情况下在不同版本之间更改。见上面JewelSea的评论。。。