Java全屏独占模式和Ubuntu 14.04

时间:2015-01-12 19:47:46

标签: java fullscreen ubuntu-14.04

我有基本的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,但我还没有使用它。

1 个答案:

答案 0 :(得分:2)

如果您不介意使用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项目的一部分。