当前位置: 首页 > 知识库问答 >
问题:

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

黄元章
2023-03-14

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

为了在OSX上执行此操作,我必须以某种方式将我的JavaFX窗口配置为漂浮在Mac OSX Dock/Menubar之上,因为默认情况下窗口会自动强制放在两者下方。这样,我的意思是我不能将窗口拖到停靠栏或菜单栏上,因为它被强制放在它下面,从而很难实现正确的覆盖。

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

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

当前结果:https://i.stack.imgur.com/nmGvG.png

预期结果:https://i.stack.imgur.com/kD6MR.png

共有1个答案

尉迟阳煦
2023-03-14

多亏了jewelsea的建议,我决定考虑使用com。太阳玻璃用户界面。窗口,将基本JavaFX窗口的级别设置为Mac OSX允许的最大级别。下面的代码片段显示了使用com有多么容易。太阳玻璃用户界面。窗口,以覆盖可以使用com找到的给定窗口句柄/对象的窗口级别。玻璃用户界面。窗getWindows()。我学会了如何使用玻璃。用户界面。窗口的另一个StackOverflow页面中找到了这个答案。

然而,有一个小缺点(但对我个人来说不是问题):即使设置了最大窗口级别,装饰过的窗口也不能放置在菜单栏上方,但是,它们仍然可以放置在dock上方。如果你想在菜单栏上方设置一个窗口,你必须首先将其设置为未装饰,显示它,使用com抓取窗口。太阳玻璃用户界面。getWindows()。获取(window_index),然后将窗口级别设置为3(Max)。您可以在此之前甚至之后设置窗口的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上有效,但我也在ArchLinuxw/KDE Plasma上测试过,这种设置最大窗口级别的方法不适用于该平台。它只是将窗口设置为“AlwaysOnTop”模式,但仍会强制设置在KDE/X11菜单栏下方。关于如何在Linux系统上绕过X11菜单栏,我所知道的唯一解决方案(到目前为止)是通过输入以下命令使用wmctrl命令行X窗口管理器:

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

wmctrl -r "Window Title" -b add,above

将窗口(装饰或未装饰)定位到您想要的(以前限制的)区域,例如菜单栏、停靠栏等上方。

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

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

 类似资料:
  • 问题内容: 我将Python 2与和一起使用,然后使用。 该程序运行良好,但是每次打开该程序时,窗口都会显示为隐藏状态,因此,直到我单击扩展坞上的图标以将其打开时,该窗口才会出现。 有什么方法可以控制此,使该窗口位于应用程序启动时打开的其他窗口之上? 需要澄清的是,在应用程序运行的整个过程中,它不一定都位于最前面。我只需要它在启动时位于其他窗口之上。 问题答案: 如果我接受您提供的代码并添加第一行

  • 当我从Netbeans运行项目时,它工作正常:图标出现在窗口的左上角和任务栏中。图像位于项目的根目录中。 当我清理和构建项目时,它生成两个安装程序:一个exe和一个MSI;当我安装应用程序并打开它时,窗口没有图标sicadcam.png,它有默认的java徽标图标。

  • main.java--(src/sample文件夹) studentcontroller.java--(src/sample/controller文件夹) studentdao.java和sexdao.java(数据访问对象)--(src/sample/model文件夹) Student.java(公共类学生和构造器)--(src/sample/model文件夹) oddbc的util下的dbut

  • 我在javafx上工作,要求是当任何按钮在屏幕上被点击时,屏蔽/剪辑特定的屏幕。当按钮被点击时,在我们收到响应之前,我应该限制用户访问页面中的其他选项/按钮。用户需要等待,直到请求得到处理。当请求得到处理时,我需要禁用/屏蔽/剪辑我的主窗口(我不确定确切的术语)。我怎么能这样做? 我用的是java 1.7_25

  • 这是我的html代码: 和css代码:

  • 如何在ApacheFlink中为会话窗口分配id? 最后,我希望在会话窗口打开时,使用会话窗口id逐个充实事件(我不希望等到窗口关闭后再发出充实事件)。 我尝试使用AggregateFunction来实现这一点,但是我认为merge()并没有像我所期望的那样工作。它似乎是用于合并窗口而不是窗格(触发触发)。在我的管道中似乎从未调用过它。因此,触发器之间似乎没有共享状态! 会话窗口ID将是落入窗口的