2015-01-12 4 views
2

JFrame을 전체 화면으로 설정하고 디스플레이 해상도를 변경하는 기본 Java 코드가 있습니다. 이 코드는 Oracle 튜토리얼의 예제 코드와 동일합니다.자바 전체 화면 단독 모드 및 우분투 14.04

모든 기능은 최신 Java 7.0 및 Java 8.0과 함께 Ubuntu 14.04에서 작동하지만 제목 표시 줄과 메뉴 모음은 전체 화면 창 상단에 계속 표시됩니다.

다른 답변은 Compiz 관리자에서 "레거시 전체 화면 지원"을 사용하도록 설정하고 있지만이 작업을 수행했지만 변경된 사항은 없습니다.

다른 해결 방법이 있습니까? 예제 코드에

링크 : http://docs.oracle.com/javase/tutorial/extra/fullscreen/examples/MultiBufferTest.java

예제 코드는 프레임이 아닌 JFrame의를 사용하지만, 나는 일을하거나 못 했어. 당신이 JNA를 사용하여 괜찮다면

+0

작성자에 따르면 frame.setUndecorated (true)가 이미 코드에 있습니다. 그것은 우분투입니다. – ruediste

+0

예, 이것은 우분투 문제인 것 같습니다. 나는 Minecraft에 관한 다른 게시물을 보았는데 같은 행동을 보였다. 그러나 제안 된 수정 프로그램은 효과가 없습니다. –

답변

1

, 나는이 작업을 수행하는 방식이다 : 당신은 당신의 프로젝트에 JNA와 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; 
} 

.

나를 위해 쿠분투 14.10에서 작동합니다.

원래이 코드를 내 vlcj 프로젝트의 일부로 작성했습니다. https://github.com/caprica/vlcj/blob/vlcj-3.1.0/src/main/java/uk/co/caprica/vlcj/runtime/x/LibXUtil.java.

+0

와우. 나는 JNA를 사용한 적이 없으며, SWIG와 JNI 만 사용했습니다. 그건 재미있어 보여. 그러나 초보자가 더 쉽게 이해할 수 있기를 바랬습니다. –

+0

나는 "순수한"자바로 작동하도록 오랜 시간을 보냈다. Windows의 경우에도 이런 식으로 원시 호출을 사용하여 내가 원하는 방식으로 동작시킬 수있는 유일한 방법이었습니다. 쉽지 않다는 걱정이 들면 유틸리티 클래스에 붙이고 구현을 잊어 버리십시오. 이해하는 것이 그렇게 중요하지 않습니다. – caprica