Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вы должны быть в состоянии "действительно полноэкранный" с 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 System (aka X11). В разделе X у вас есть сервер X (обычно, что-то вроде "видеодрайвера" ) и клиенты, которые чаще всего подключаются к нему с одного компьютера (loopback).

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

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

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

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

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

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

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

Спецификация здесь: 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 с использованием отражения... eww...) и установка правильного окна намеки, сами.

Да, эта грубая...

Ответ 2

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

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

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-Server от NVIDIA.

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

Ответ 3

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

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

Ответ 4

Я использовал выпуски Oracle 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();

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

Ответ 5

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