13

我在“openSUSE 11.4 (x86_64)”上以全屏模式运行 Java 应用程序时遇到问题。我正在使用 Java 1.6.0_26-b03。

我尝试运行两个全屏应用程序示例:

  1. 来自 Oracle 站点的示例:显示模式测试
  2. 从Codealchemists下载的 JDarkRoom.jar(简单文本编辑器)。

在这两种情况下,我在应用程序上都有一个可见的 Linux 任务栏。它必须与系统设置/配置有关吗?

4

5 回答 5

18

应该能够使用GraphicsDevice.setFullScreenWindow (window). 但是,由于最流行的 Java 运行时中的错误,这可能不适用于运行 1.6 = Java 6 系列中某些“损坏”版本的系统。我尚未对此进行彻底测试,因此该补丁可能尚未传播到普通民众中。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7057287

背景/理论

好的,所以这里的信息太多了,没有足够的帮助……这就是为什么这不起作用……</p>

没有 Linux 桌面

PC 型机器上的基于 Linux 的操作系统以及其他 Unices(MacOSX 除外)通常使用 X Window System(又名 X11)。在 X 下,您有一个 X 服务器(通常,有点像“视频驱动程序”)和连接到它的客户端,通常情况下,来自同一台机器(环回)。

窗口的布局和放置由称为窗口管理器的特殊客户端程序控制。它负责装饰窗口(例如绘制标题栏或调整大小手柄)并定位它们。

您的程序将是一个 X 客户端。它可以请求(但不要求)在屏幕上的某个位置或某个尺寸放置。各种窗口管理器或多或少倾向于为您提供所需的内容。

除了,大多数台式机玩得很好 (有时)

现在,到目前为止,大多数 Linux 桌面都使用 Gnome 桌面,K 桌面排在第二位,其他一些桌面也得到了相当广泛的使用。“不错”的是这两个桌面环境(以及其他一些环境,例如用于低端 PC 的 XFCE)都符合FreeDesktop.org 窗口管理器提示标准。

(超级简化:)通常,屏幕的一个或多个边缘会有面板。通常,顶部只有一个,但有很多变化。这些面板区域不被视为“屏幕的一部分”,因此窗口管理器会告诉您的应用程序,“不,这超出了您可以玩的区域;这个屏幕不是1920×1080,只有1890×1080。” 当然,这可能与您编写应用程序时的预期完全不同,您可能在我的上网本上,物理屏幕为 800×480,假装只有 780×480。

对于 99% 的应用程序来说,这很棒。Windows 不会妨碍面板,因此您始终可以访问面板进行关键控制,例如按下静音或切换到另一个程序或其他东西。

这些“提示”允许您请求对顶层窗口进行特殊处理。例如,你可以要求你没有标题栏——或者减少的、“调色板”类型的标题栏;您可以请求在窗口列表或任务栏或活动概述或任何其他可能用于显示活动窗口的界面上跳过;或者,您可以请求真正全屏显示,并将其他所有内容都推开,甚至是面板。

规范在这里:http ://standards.freedesktop.org/wm-spec/wm-spec-latest.html

失败:

基本上,窗口管理器提示规范没有被 Sun/Oracle(或 Red Hat,他们抄袭 Sun/Oracle,或者可能是 IBM,因为他们可能做了同样的事情,但我没有看到有人抱怨他们)…</p>

虽然,我确实看到一些关于它是否是 K 桌面环境的窗口管理器 (KWin) 的错误(特别是)的抱怨,因为显然这个错误只出现在 K 中,而不出现在 Gnome、XFCE 和朋友中。

解决方法

除了修补您的 Java 运行时(和/或您的客户的)之外,唯一真正的解决方法是使用特定于平台的 Java 库(可能使用反射来获取底层 AWT 对象……eww……)并自己设置正确的窗口提示.

是的,这太恶心了……</p>

于 2012-01-12T16:50:46.370 回答
11

只是对bgroenks方法的精确说明:
在 Ubuntu 14.10 (Unity) 上使用 java7 和 java8 可以正常工作。

但是:你必须设置frame.setResizable(true);,否则它将不起作用。

注意:全屏模式仅适用于 JFrame(无 JDialog 或 JWindow)。

这里有一个示例代码:它取代了setVisible(true)

/**
 * @param frame
 * @param doPack
 * @return device.isFullScreenSupported
 */
static public boolean fullScreen(final JFrame frame, boolean doPack) {

    GraphicsDevice device = frame.getGraphicsConfiguration().getDevice();
    boolean result = device.isFullScreenSupported();

    if (result) {
        frame.setUndecorated(true);
        frame.setResizable(true);

        frame.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent arg0) {
                frame.setAlwaysOnTop(true);
            }

            @Override
            public void focusLost(FocusEvent arg0) {
                frame.setAlwaysOnTop(false);
            }
        });

        if (doPack)
            frame.pack();

        device.setFullScreenWindow(frame);
    }
    else {
        frame.setPreferredSize(frame.getGraphicsConfiguration().getBounds().getSize());

        if (doPack)
            frame.pack();

        frame.setResizable(true);

        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        boolean successful = frame.getExtendedState() == Frame.MAXIMIZED_BOTH;

        frame.setVisible(true);

        if (!successful)
            frame.setExtendedState(Frame.MAXIMIZED_BOTH);
    }
    return result;
}

问候,斯蒂芬。

于 2014-07-14T20:00:30.163 回答
6

我意识到这个问题有点老了,但我偶然发现它正在寻找相同的答案。

经过大量的实验,我想出了一个很好的解决方案:

GraphicsDevice d = GraphicsEnvironment
    .getLocalGraphicsEnvironment().getDefaultScreenDevice();
if (d.isFullScreenSupported()) {
    frame.setUndecorated(true);
    frame.setResizable(false);
    frame.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent arg0) {
            frame.setAlwaysOnTop(true);
        }

        @Override
        public void focusLost(FocusEvent arg0) {
            frame.setAlwaysOnTop(false);
        }
    });
    d.setFullScreenWindow(frame);
} else {
    frame.setVisible(true);
}

焦点侦听器是这样的,用户可以 ALT-TAB 或 META-D 离开窗口,而不会立即强制重新聚焦。

这适用于我的带有 KDE 4 的 Linux Mint 15 系统。我也在使用 NVIDIA X-Server。

希望这可以帮助!让我知道它是否也适合你们!

于 2013-12-15T19:31:18.113 回答
2

以上都不适合我,我使用的是 XUbuntu,但我只是尝试使用 JWindow 而不是 JFrame 并且它有效!这太令人沮丧了,希望它对你有用。哦,我应该提到我还没有看过 API,而且我真的不熟悉 JWindow 类,所以我不确定 JWindow 和 JFrame 之间到底有什么区别。祝你好运。

于 2012-11-09T05:26:40.037 回答
1

我使用全屏模式使用 Oracle Java 版本 1.6.0_31 和 1.6.0_26。我在 Ubuntu 的任务栏上方没有显示窗口时遇到了一些问题。但是,我能够使用这个小代码示例使其工作。

// Create a window for full-screen mode; add a button to leave full-screen mode
GraphicsDevice gs = GraphicsEnvironment.getLocalGraphicsEnvironment().
                    getDefaultScreenDevice(); 
                    //or initialize this for a specific display
Frame frame = new Frame(gs.getDefaultConfiguration());
Window win = new Window(frame);
Canvas c = new Canvas();
c.setBackground(Color.RED);
win.add(c);
win.show();  //or setVisible(true);

// Enter full-screen mode
gs.setFullScreenWindow(win);
win.validate();

有效的技巧是首先使窗口可见,然后将窗口置于全屏模式。在显示之前设置全屏模式会导致窗口上方的任务栏。

于 2012-04-23T16:52:20.067 回答