【问题标题】:Java full-screen exclusive mode and Ubuntu 14.04Java全屏独享模式和Ubuntu 14.04
【发布时间】:2015-03-10 16:03:59
【问题描述】:

我有基本的 Java 代码来将 JFrame 设置为全屏并更改显示分辨率。此代码与 Oracle 教程中的示例代码相同。

在带有最新 Java 7.0 和 Java 8.0 的 Ubuntu 14.04 上一切正常,但标题栏和菜单栏仍显示在全屏窗口的顶部。

其他答案建议在 Compiz 管理器中启用“旧版全屏支持”,但我已经这样做了,没有任何改变。

还有其他解决方法吗?

示例代码链接:http://docs.oracle.com/javase/tutorial/extra/fullscreen/examples/MultiBufferTest.java

示例代码使用 Frame 而不是 JFrame,但我还没有开始工作。

【问题讨论】:

  • 根据作者的说法,frame.setUndecorated(true) 已经在代码中了。这是 Ubuntu。
  • 是的,这似乎是一个 Ubuntu 问题。我已经看到有关 Minecraft 的其他帖子显示出相同的行为。但是那些提议的修复没有奏效。

标签: java fullscreen ubuntu-14.04


【解决方案1】:

如果你不介意使用 JNA,我的做法是:

private static final int _NET_WM_STATE_REMOVE = 0;

private static final int _NET_WM_STATE_ADD = 1;

private static final int TRUE = 1;

public static boolean setFullScreenWindow(Window w, boolean fullScreen) {
    X11 x = X11.INSTANCE;
    Display display = null;
    try {
        display = x.XOpenDisplay(null);
        int result = sendClientMessage(display, Native.getWindowID(w), "_NET_WM_STATE", new NativeLong(fullScreen ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE), x.XInternAtom(display, "_NET_WM_STATE_FULLSCREEN", false));
        return result != 0;
    }
    finally {
        if(display != null) {
            x.XCloseDisplay(display);
        }
    }
}

private static int sendClientMessage(Display display, long wid, String msg, NativeLong data0, NativeLong data1) {
    X11 x = X11.INSTANCE;
    XEvent event = new XEvent();
    event.type = X11.ClientMessage;
    event.setType(XClientMessageEvent.class);
    event.xclient.type = X11.ClientMessage;
    event.xclient.serial = new NativeLong(0L);
    event.xclient.send_event = TRUE;
    event.xclient.message_type = x.XInternAtom(display, msg, false);
    event.xclient.window = new com.sun.jna.platform.unix.X11.Window(wid);
    event.xclient.format = 32;
    event.xclient.data.setType(NativeLong[].class);
    event.xclient.data.l[0] = data0;
    event.xclient.data.l[1] = data1;
    event.xclient.data.l[2] = new NativeLong(0L);
    event.xclient.data.l[3] = new NativeLong(0L);
    event.xclient.data.l[4] = new NativeLong(0L);
    NativeLong mask = new NativeLong(X11.SubstructureRedirectMask | X11.SubstructureNotifyMask);
    int result = x.XSendEvent(display, x.XDefaultRootWindow(display), 0, mask, event);
    x.XFlush(display);
    return result;
}

您需要将 JNA 和 JNA Platform jar 添加到您的项目中。

这适用于 Kubuntu 14.10。

我最初在 https://github.com/caprica/vlcj/blob/vlcj-3.1.0/src/main/java/uk/co/caprica/vlcj/runtime/x/LibXUtil.java 处编写此代码作为我的 vlcj 项目的一部分。

【讨论】:

  • 哇。我从来没有使用过 JNA,只有 JNI 和 SWIG。这看起来很有趣。但我肯定希望初学者能更容易理解。
  • 我花了很长时间试图让它与“纯”Java 一起工作。对我来说,即使在 Windows 上,使用像这样的本机调用也是我可以让它按照我想要的方式运行的唯一方法。如果您担心它不容易,只需将它放在实用程序类中而忘记实现,理解它并不是那么重要。
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 2014-05-18
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多