Java全屏独占模式和Ubuntu 14.04

标签 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,但我还没有使用它们。

最佳答案

如果您不介意使用 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 上有效。

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

关于Java全屏独占模式和Ubuntu 14.04,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27909614/

相关文章:

php - codeigniter 中的远程数据库连接

c++ - 多线程定时器类

java - 如何处理 org.mockito.exceptions.misusing.MissingMethodInitationException?

jquery - 如何使用 jQuery 使 div 全屏并位于所有其他元素之上?

java - 在 Java 中增加 Map 值的最有效方法

javascript - 带有全屏 API 的 Ember.js 历史

ios - 退出 youtube 全屏后应用旋转为纵向

ubuntu - Minikube 在 Ubuntu 中安装 - 运行 SSH 命令出现问题

java - 在服务器上运行 Shell 脚本

java - 如何在 java 中将 list<object> 转换为 list<MyType> ?