«Всегда на вершине» Windows с Java

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
86
0
84 816
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте этот метод класса 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 );
    }
}

alt text

Window remains on top even when is not active

Вы могли подумать, что простой поиск по запросу «Java-приложение всегда наверху» даст такой ответ, но он не смог его найти. Спасибо.

Laplie Anderson 18.11.2008 17:21

Угадай, что. Теперь это так !! :) Это приводит вас сюда! google.com/search?&q=java+application+always+on+top

OscarRyz 15.10.2009 04:07

Это просто и здорово. Я тоже искал что-то подобное, но не знал, что они реализовали это в Java 1.5. Спасибо за публикацию.

Kushal Paudyal 19.11.2009 01:43

К сожалению, это не работает для меня при запуске полноэкранного приложения, такого как видеоигра. Кто-нибудь знает, как добиться успеха в этой ситуации?

Dream Lane 06.05.2011 01:02

@Dream lane, я бы, наверное, задал это новым вопросом

rogerdpack 13.05.2011 17:27

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

James P. 01.05.2012 21:11

Это похоже на первый код, который я когда-либо видел, который дополняет логические параметры пробелами.

MMJZ 11.04.2014 19:05

@MMJZ ха-ха, правда. На самом деле я удивлен, что не сделал этого для декларации args. Я всегда использую пробел после скобок. Это очень-очень старая привычка, которую я выработал еще в те дни, когда я программировал с помощью блокнота. Двойной щелчок по слову выбирает круглые скобки, если между ними нет пробела, что очень раздражало, потому что мне приходилось удалять их впоследствии, если я намеревался повторно использовать переменную в другом месте.

OscarRyz 12.04.2014 01:31

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

jan_kiran 30.05.2018 18:06

Не работает, если открыт Google Chrome DevTools: stackoverflow.com/questions/58371767/…

Stefan 14.10.2019 10:21

@Stefan хм, да, он делает i.stack.imgur.com/H99Ra.png (11 лет спустя этот код все еще работает)

OscarRyz 15.10.2019 16:48

По моим наблюдениям, я обнаружил, что привилегия 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 13.04.2015 06:36

@Trejkaz Что ж, это верная точка зрения. Я больше не занимаюсь свингом.

pinkpanther 13.04.2015 10:39

Это отлично работает для моего варианта использования! Ключевым моментом была установка его обратно на false.

rococo 21.11.2017 02:53

не используйте setFullScreenWindow, просто получите размер экрана, а затем setSize, и все будет хорошо.

Это ответ или комментарий?

Failed Scientist 22.07.2018 07:51

@FailedScientist прославленный комментарий

clankill3r 14.11.2019 18:08

Другие вопросы по теме