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

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

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

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

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


person Knight of Ni    schedule 12.01.2012    source источник


Ответы (5)


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

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

Общие сведения/теория

Итак, здесь слишком много информации и недостаточно помощи… Вот небольшая информация о том, почему это не сработало…

Рабочий стол Linux не существует

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

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

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

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

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

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

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

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

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

И сбой:

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

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

Временное решение

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

Да, это мерзко…

person BRPocock    schedule 12.01.2012

Просто точность метода 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;
}

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

person Stéphane Millien    schedule 14.07.2014
comment
Я смог заставить его работать без необходимости setResizable(true) и без прослушивателей фокуса. Единственная проблема, с которой я столкнулся, заключалась в изменении режима отображения, которую я решил с помощью DisplayMode.BIT_DEPTH_MULTI и DisplayMode.REFRESH_RATE_UNKNOWN. Использование Kubuntu 15.10 с Java 8. - person code_dredd; 16.01.2016
comment
Метод Смиллиена работал у меня с Ubuntu 16.04 и Unity DE. - person Prime624; 19.03.2018

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

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

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.

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

person bgroenks    schedule 15.12.2013
comment
Этот метод не работал у меня с Ubuntu 16.04 и Unity DE. - person Prime624; 19.03.2018

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

person Kevin Bigler    schedule 09.11.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();

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

person ricosrealm    schedule 23.04.2012
comment
Было бы полезно и более полно определить ваш объект gs. - person Roy Hinkley; 20.07.2017