Java в полноэкранном режиме на Linux-как покрыть панель задач?


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

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

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

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

5 12

5 ответов:

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

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

Предпосылки / Теория

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

Нет рабочего стола Linux

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

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

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

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

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

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

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

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

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

И неудача:

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

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

Обходной Путь

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

Да, это отвратительно ...

Просто точность по методу 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;
}
С Уважением, Стефан.

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

После долгих экспериментов я пришел к хорошему решению:
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. Я также использую X-сервер NVIDIA.

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

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

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

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