"Всегда сверху" Windows с Java - PullRequest
80 голосов
/ 18 ноября 2008

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

Ответы [ 3 ]

149 голосов
/ 18 ноября 2008

Попробуйте этот метод класса Window:

Window.setAlwaysOnTop (булево)

Он работает так же, как по умолчанию в Windows TaskManager: переключиться на другое приложение, но всегда отображается сверху.

Это было добавлено в 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

Окно остается сверху, даже когда оно не активно

10 голосов
/ 04 января 2014

Из моих наблюдений я обнаружил, что привилегия 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();}
    }
0 голосов
/ 22 июля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...