【问题标题】:Change AWT Frame's maximize behaviour to fullscreen on MacOS在 MacOS 上将 AWT Frame 的最大化行为更改为全屏
【发布时间】:2022-01-26 18:16:52
【问题描述】:

在 MacOS 上运行的 Java 程序中创建 AWT Frame 时,框架标题栏中的最大化按钮会最大化窗口:

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

当我创建一个 Swing JFrame 实例时,同一个按钮会将窗口切换到全屏模式,这是 MacOS 上的标准行为。当我将鼠标悬停在该按钮上时,它甚至在视觉上看起来也有所不同:

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

有什么方法可以用 AWT 的 Frame 复制 JFrame 的“最大化到全屏”行为?我扫描了整个 JFrame 类的代码,但无法识别任何会以这种方式切换 Frame 行为的逻辑。

【问题讨论】:

  • 您也许可以利用here 中提到的com.apple.eawt 方法,但我没有尝试过。
  • 为什么在这个时代使用 AWT?
  • 我想要一个轻巧且尽可能简单的东西,因为我只需要一个带有画布的窗口。其他一切都将通过 Java2D 发生,我不明白为什么我需要 Swing 的所有包袱来打开一个简单的窗口。
  • 我尝试通过反射使用com.apple.eawt,得到以下java.lang.IllegalAccessExceptioncannot access class com.apple.eawt.FullScreenUtilities (in module java.desktop) because module java.desktop does not export com.apple.eawt to unnamed module @57fffcd7
  • @tyrondis: AFAIK,Java 8 是最后一个完全支持的 SDK; Java 11 丢失了QuitStrategy,Java 17 没有;作为参考,示例链接到源代码;也可以考虑setUndecorated()

标签: java macos swing jvm awt


【解决方案1】:

试试这个代码:

import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.awt.Window;

public class MyFrame extends Frame {

    MyFrame() {
        for (Window w : Window.getWindows()) {
            GraphicsEnvironment.getLocalGraphicsEnvironment()
                    .getDefaultScreenDevice().setFullScreenWindow(w);
        }
    }

    public static void main(String args[]) {
        MyFrame f = new MyFrame();
        f.setVisible(true);
    }

}

【讨论】:

  • 这段代码会全屏启动我的窗口,但是,我希望 Frame 具有与 JFrame 窗口相同的“最大化到全屏”按钮并采取相应措施。
  • 抱歉,这不可能。
猜你喜欢
  • 2020-04-21
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2011-06-23
  • 2016-07-24
相关资源
最近更新 更多