В Java есть ли способ, чтобы окно было «Всегда наверху», независимо от того, переключает ли пользователь фокус на другое приложение? Я искал в Интернете, и все решения опираются на какой-то интерфейс JNI с собственными привязками. Неужели это не единственный способ сделать это? .. Или нет?




Попробуйте этот метод класса Window:
Window.setAlwaysOnTop (логическое)
Он работает так же, как и по умолчанию в диспетчере задач Windows: переключитесь на другое приложение, но оно всегда отображается сверху.
Это было добавлено в Java 1.5
Образец кода:
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Annoying {
public static void main(String[] args) {
JFrame frame = new JFrame("Hello!!");
// Set's the window to be "always on top"
frame.setAlwaysOnTop( true );
frame.setLocationByPlatform( true );
frame.add( new JLabel(" Isn't this annoying?") );
frame.pack();
frame.setVisible( true );
}
}

Window remains on top even when is not active
Угадай, что. Теперь это так !! :) Это приводит вас сюда! google.com/search?&q=java+application+always+on+top
Это просто и здорово. Я тоже искал что-то подобное, но не знал, что они реализовали это в Java 1.5. Спасибо за публикацию.
К сожалению, это не работает для меня при запуске полноэкранного приложения, такого как видеоигра. Кто-нибудь знает, как добиться успеха в этой ситуации?
@Dream lane, я бы, наверное, задал это новым вопросом
Это работает для диалогового окна входа в систему, но мое главное окно приложения затем переходит в фоновый режим. Я открыт для предложений.
Это похоже на первый код, который я когда-либо видел, который дополняет логические параметры пробелами.
@MMJZ ха-ха, правда. На самом деле я удивлен, что не сделал этого для декларации args. Я всегда использую пробел после скобок. Это очень-очень старая привычка, которую я выработал еще в те дни, когда я программировал с помощью блокнота. Двойной щелчок по слову выбирает круглые скобки, если между ними нет пробела, что очень раздражало, потому что мне приходилось удалять их впоследствии, если я намеревался повторно использовать переменную в другом месте.
Это отлично работает, но если пользователь переключается на другой рабочий стол / экран в Mac или Linux, как сделать так, чтобы он отображался и на этом экране
Не работает, если открыт Google Chrome DevTools: stackoverflow.com/questions/58371767/…
@Stefan хм, да, он делает i.stack.imgur.com/H99Ra.png (11 лет спустя этот код все еще работает)
По моим наблюдениям, я обнаружил, что привилегия AlwaysOnTop предоставляется самому последнему процессу, который требует, чтобы он всегда был наверху.
Итак, если у вас есть приложение, в котором setAlwaysOnTop(true) и более поздние версии других приложений используют эту опцию, привилегия предоставляется второму приложению. Чтобы обойти это, я установил setAlwaysOnTop(false) и снова setAlwaysOnTop(true) всякий раз, когда какое-либо окно появляется поверх текущего окна.
Проверял с wordweb в windows. WordWeb - одно из приложений, использующих опцию AlwaysOnTop от OS.
Я не уверен, правильно ли это работает с вашим игровым сценарием.
Предупреждение: Я не знаю о побочных эффектах.
Вот пример кода:
import java.awt.event.*;
import javax.swing.*;
public class MainWindow extends JFrame implements WindowFocusListener
{
public MainWindow()
{
addWindowFocusListener(this);
setAlwaysOnTop(true);
this.setFocusable(true);
// this.setFocusableWindowState(true);
panel = new JPanel();
//setSize(WIDTH,HEIGHT);
setUndecorated(true);
setLocation(X,Y);
setExtendedState(MAXIMIZED_BOTH);
setVisible(true);
}
public void windowGainedFocus(WindowEvent e){}
public void windowLostFocus(WindowEvent e)
{
if (e.getNewState()!=e.WINDOW_CLOSED){
//toFront();
//requestFocus();
setAlwaysOnTop(false);
setAlwaysOnTop(true);
//requestFocusInWindow();
System.out.println("focus lost");
}
}
private JPanel panel;
private static final int WIDTH = 200;
private static final int HEIGHT = 200;
private static final int X = 100;
private static final int Y = 100;
public static void main(String args[]){
new MainWindow();}
}
Снова установить для него значение false и true при появлении другого окна не похоже на работоспособное решение по одной простой причине - что, если другое приложение сделает то же самое?
@Trejkaz Что ж, это верная точка зрения. Я больше не занимаюсь свингом.
Это отлично работает для моего варианта использования! Ключевым моментом была установка его обратно на false.
не используйте setFullScreenWindow, просто получите размер экрана, а затем setSize, и все будет хорошо.
Это ответ или комментарий?
@FailedScientist прославленный комментарий
Вы могли подумать, что простой поиск по запросу «Java-приложение всегда наверху» даст такой ответ, но он не смог его найти. Спасибо.