"Всегда на высоте" Windows с Java


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

3 76

3 ответа:

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

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

Итак, если у вас есть приложение, которое setAlwaysOnTop(true) и позже другое приложение использует эту опцию, привилегия предоставляется второму приложению. Для того, чтобы обойти это я установил setAlwaysOnTop(false) и снова setAlwaysOnTop(true) всякий раз, когда любое окно поверх текущего окна.

Я проверил его с wordweb на windows. WordWeb-это один из приложений, которые использует С 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();}
    }

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