ВСЕГДА на верхнем окне

Я ищу решение, чтобы держать JFrame всегда сверху и всегда всегда на самом деле.

setAlwaysOnTop( true );

Это не будет работать, когда я начну игру в полноэкранном режиме. Я знаю, что вы, как правило, не хотите, чтобы ваши окна оставались на вершине, но в этом случае это требовалось.

Ответ 1

Это невозможно сделать.

Например, диспетчер задач Windows, даже если он установлен на Always on Top, будет закрыт полноэкранными приложениями.

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

Ответ 2

Запустите другой процесс, чтобы проверить, находится ли окно сверху, если нет, установите его сверху.

Ответ 3

Это звучит как вопрос, на который Рэймонд Чен всегда должен отвечать на http://blogs.msdn.com/b/oldnewthing/. Как вы можете действительно навсегда и для истинного сохранить окно на переднем плане? Вы не можете. Потому что то, что произойдет, если в каком-то окне ELSE используется тот же трюк, чтобы держать себя всегда всегда и всегда на переднем плане? Кто победит?

Ответ 4

Это пример кода, который должен быть полезен

public class AllWaysOnTop extends JFrame implements WindowListener {

    AllWaysOnTop() {
        // Code to setup your frame
        addWindowListener(this);
        // Code to show your frame
    }

    // The window event handlers. We use WindowDeactivated to
    // try and keep the splash screen on top. Usually only keeps
    // the splash screen on top of our own java windows.
    public void windowOpened(WindowEvent event){};
    public void windowActivated(WindowEvent event){};
    public void windowDeactivated(WindowEvent event){
        toFront();
    }
    public void windowIconified(WindowEvent event){};
    public void windowDeiconified(WindowEvent event){};
    public void windowClosed(WindowEvent event){};
    public void windowClosing(WindowEvent event) {};
}

Ссылка Этот пост форума

Ответ 5

Если вы имеете в виду полноэкранный режим, как в DirectX/OpenGL/что-то еще, я не уверен, что вы (или должны) действительно его отключите. Большинство операционных систем отключает их собственное окно в полноэкранном режиме, чтобы улучшить производительность рендеринга. Swing работает через встроенный инструментарий для окон.

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

Ответ 6

Я не уверен, но я бы поспорил, что полноэкранное окно также имеет Always On Top, установленное в true, и в этом случае вы наткнулись на область поведения undefined. Обычно, когда два окна всегда установлены сверху, нет никаких гарантий относительно порядка. Я думаю, что в целом, порядок зависит только от порядка, в котором они всегда были на высоте. Поэтому в этом случае я просто подожду, пока приложение не войдет в полноэкранный режим, чтобы всегда устанавливать его сверху и видеть, работает ли это.

В других случаях ive видит, что люди запускают потоки, а затем изредка reset рамку всегда сверху.

Все эти решения являются уродливыми, поэтому используйте только тот, который позволяет вам спать по ночам.

Ответ 7

Я знаю, что этот пост старый, но я столкнулся с этой проблемой, и я нашел удовлетворительное решение. У моей программы есть некоторые уведомления, которые я хочу быть всегда наверху, но когда фильм вошел в полноэкранный режим, они исчезли. Fortunate, моя программа обновляет эти уведомления каждые 5 секунд, и если я вызываю setVisible (true) в этих JWindows, при каждом обновлении они восстанавливают верхнюю позицию, если они потеряли ее.

Ответ 8

Я искал сделать то же самое, что и OP, у меня появилось приложение на переднем плане, пока игра закончилась. Он не работает в полноэкранном режиме, но если вы поместите игру в оконный режим и настройте параметры окна, чтобы они соответствовали вашему телевизору, это работает. Мне понадобился только frame.setAlwaysOnTop, чтобы он работал.