Java в полноэкранном режиме на Linux - как покрыть панель задач? - PullRequest
12 голосов
/ 12 января 2012

У меня проблема с запуском приложения Java в полноэкранном режиме на "openSUSE 11.4 (x86_64)".Я использую Java 1.6.0_26-b03.

Я пытаюсь запустить два примера полноэкранного приложения:

  1. Пример с сайта Oracle: Тест режима отображения .
  2. JDarkRoom.jar (простой текстовый редактор), загруженный из Codealchemists .

В обоих случаях у меня есть панель задач Linux, видимая поверх приложения.Это должно быть что-то с настройками системы / конфигурации?

Ответы [ 5 ]

18 голосов
/ 12 января 2012

Вы должны быть в состоянии перейти на «действительно полный экран» с GraphicsDevice.setFullScreenWindow (window).Однако из-за ошибок в самых популярных средах исполнения Java это может не сработать в системах, использующих определенные «сломанные» версии в серии 1.6 = Java 6.Я не проверил это полностью, так что, возможно, патч еще не распространился среди населения.

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

Фон / теория

ОК, так что здесь слишком много информации и недостаточно помощи ... Вот немного почему это не сработало правильно ...

Нет Linux Desktop

Операционные системы на основе Linux на компьютерах типа ПК, а также другие Unices (за частичным исключением для MacOSX), обычно использующие систему X Window (также известную как X11)).В X у вас есть X-сервер (обычно что-то вроде «видеодрайвера») и клиентов , которые подключаются к нему чаще всего с одной и той же машины (loopback).

Расположение и расположение окон контролируется специальной клиентской программой , которая называется Window Manager.Он отвечает за оформление окон (например, отрисовку строк заголовка или ручек изменения размера) и их расположение.

Ваша программа будет X-клиентом.Он может запрашивать - но не требовать - размещение на экране в определенной позиции или определенном размере.Различные оконные менеджеры более (или менее) склонны давать вам то, что вы хотите.

Кроме того, большинство рабочих столов играют хорошо (иногда)

В настоящее время большинство рабочих столов Linux используют рабочий стол Gnome, который занимает второе место после K Desktop, а некоторые другие довольно широко используются.Что «приятно», так это то, что обе эти среды рабочего стола (а также некоторые другие, такие как XFCE для недорогих ПК) соответствуют FreeDesktop.org Window Manager Hints стандартам.

(Супер-упрощение :) Обычно на одном или нескольких краях экрана располагаются панели.Обычно есть только один, сверху, но есть много вариантов.Эти области панели не считаются «частью экрана», поэтому диспетчер окон сообщает вашему приложению: «Нет, это за пределами области, в которой вам разрешено играть;этот экран не 1920 × 1080, а только 1890 × 1080 ». Конечно, это может быть совершенно другое расположение, чем то, что вы ожидали, когда писали свое приложение, и вы могли бы быть на моем нетбуке с физическим экраном 800 ×480 притворяется только 780 × 480.

Для 99% приложений это здорово.Windows не мешает панелям, поэтому вы всегда можете обратиться к Panel для критических элементов управления, таких как отключение звука, переключение на другую программу или что-то в этом роде.

Эти «подсказки» позволяют вам запроситьокна верхнего уровня обрабатываются специально.Например, вы можете запросить отсутствие строки заголовка или уменьшенной строки заголовка типа «палитра»;Вы можете запросить пропуск в списке окон, панели задач, обзоре действий или любом другом интерфейсе, который может использоваться для отображения активных окон;или, вы можете запросить действительно в полноэкранном режиме и оттолкнуть все остальное, даже панели.

Спецификация здесь: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html

И ошибка:

По сути, спецификация подсказок оконного менеджера не выполнялась должным образом Sun / Oracle (или Red Hat, скопировавшей Sun / Oracle, или, возможно,IBM, потому что они, вероятно, сделали то же самое, но я не вижу, чтобы кто-то жаловался на них)…

Хотя, я действительно вижу некоторые жалобы о том, является ли это ошибкой (особенно) в K Desktop Environment.оконный менеджер (KWin), так как очевидно эта ошибка появляется только в K, а не в Gnome, XFCE и друзьях.

Work-Around

Помимо исправления ваших сред выполнения Java (d / или ваших клиентов), единственным реальным решением было бы использование платформенно-зависимых библиотек Java (возможно, захватить базовые объекты AWT с помощью отражения… eww…) и самостоятельно установить соответствующие подсказки окна.

Да, это брутто ...

8 голосов
/ 15 июля 2014

Только точность метода bgroenks :
Это нормально работает с java7 и java8 в Ubuntu 14.10 (Unity).

НО: Вы должны установить 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;
}

С уважением, Стефан.

6 голосов
/ 15 декабря 2013

Я понимаю, что этот вопрос немного стар, но я наткнулся на него в поисках того же ответа.

После долгих экспериментов я нашел хорошее решение:

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 из окна без немедленной принудительной перефокусировки.

Это работает на моей системе Linux Mint 15 с KDE 4. Я такжеиспользуя NVIDIA X-Server.

Надеюсь, это поможет!Дайте мне знать, если это сработает и у вас, ребята!

1 голос
/ 09 ноября 2012

Ничего из вышеперечисленного у меня не сработало, я использую XUbuntu, но я просто попытался использовать JWindow вместо JFrame, и это сработало! Это было так неприятно, надеюсь, это работает для вас. О, я должен отметить, что я еще не смотрел на API, и я действительно не знаком с классом JWindow, поэтому я не уверен точно, в чем различия между JWindow и JFrame. Удачи.

1 голос
/ 23 апреля 2012

Я использовал версии 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();

Трюк, который сработал, - сначала сделать окно видимым, а затем перевести окно в полноэкранный режим. Установка полноэкранного режима до его отображения привела к появлению панели задач над окном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...