【问题标题】:Fullscreen JFrames leave a black space when they're disposed on a Mac全屏 JFrame 在 Mac 上放置时会留下一个黑色空间
【发布时间】:2015-05-11 01:11:46
【问题描述】:

我正在创建一个文件编辑应用程序,每个文件当前都有自己的 JFrame。有很多关于使框架全屏的问题,它在我的应用程序中运行良好。但是,当我从全屏关闭框架时出现问题。

通常,我将默认关闭操作设置为EXIT_ON_CLOSE。当框架关闭时,应用程序退出并关闭全屏空间,让我回到我的桌面。但是,当我将其保留在 HIDE_ON_CLOSE 或将其设置为 DISPOSE_ON_CLOSE(这是我真正想要的)时,关闭全屏 JFrame 会留下黑屏。我仍然可以在屏幕之间滑动,查看 Dock 和菜单栏等,但如果有另一个框架打开,它会一直留在那里,直到我退出应用程序。

这是一个例子:

package net.kittycat3141.helpers;

import javax.swing.JFrame;

import net.kittycat3141.lib.util.OSXTools;

/**
 * @author Kittycat3141
 */
public class MCVP_FullScreenJFrame extends JFrame {
    private static final long serialVersionUID = -6467532883940003341L;

    public static void main(String[] args) {
        JFrame a = new MCVP_FullScreenJFrame();
        OSXTools.enableFullscreen(a);
        a.setVisible(true);

        JFrame b = new MCVP_FullScreenJFrame();
        OSXTools.enableFullscreen(b);
        b.setVisible(true);
    }
}

OSXTools.enableFullscreen(JFrame) 这样做:

if(isRunningOnMac()) {
    Class util;
    try {
        util = Class.forName("com.apple.eawt.FullScreenUtilities");
        Class params[] = new Class[]{Window.class, Boolean.TYPE};
        Method method = util.getMethod("setWindowCanFullScreen", params);
        method.invoke(util, frame, true);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

如果您运行程序并将两个帧都设为全屏,然后关闭其中一个,您最终会出现黑屏。您仍然可以滑动到其他应用程序/桌面等,但在程序终止之前它不会消失。

如何正确关闭 JFrame 以使其他框架保持打开状态,但黑色空间不会留在那里?

我正在运行 OS X Yosemite 和 Java 7。

【问题讨论】:

  • 你是如何设置全屏的?你是如何关闭全屏帧的?
  • 我正在使用FullScreenUtilities 类并通过反射访问它。对于关闭,我只是在做setDefaultCloseOperation(DISPOSE_ON_CLOSE);,所以用户可以点击红色的 X 来关闭框架。
  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将导致更少的混乱和更好的响应
  • 好的。我正在考虑,但如果没有帮助,我不想麻烦。
  • 我无法访问FullScreenUtilities,所以很难知道发生了什么,并且至少有两种方法可以为使用 Java 的 MacO 提供全屏支持 ;)

标签: java macos jframe fullscreen


【解决方案1】:

解决方案相当长,但它有效。 FullScreenUtilities只有一个requestToggleFullScreen方法,所以需要在关闭时检测框架是否全屏,如果是则切换。

不幸的是,也没有获取帧是否全屏的功能,因此您需要为其附加一个侦听器。当帧全屏或非全屏时,侦听器会被调用,因此您可以跟踪您使用的每个帧。复杂的部分是一切都需要反思。

通过确保框架在关闭时不是全屏的,可以避免它留下的黑色空间。

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多