Windows “Завжди зверху” з Java


85

У Java, чи є спосіб мати вікно "Завжди зверху", незалежно від того, перемикає користувач фокус на іншу програму? Я шукав в Інтернеті, і всі рішення спираються на якийсь інтерфейс JNI з рідними прив'язками. Воістину це не може бути єдиним способом зробити це? .. чи це так?

Відповіді:


159

Спробуйте цей метод 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 );
    }
}

текст заміщення

Вікно залишається зверху, навіть коли воно не активне


3
ви думаєте, що простий пошук "додаток Java завжди зверху" матиме таку відповідь, але він не міг його знайти. Дякую.
Лаплі Андерсон,

46
Вгадай що. Тепер це так !! :) Це призводить вас сюди! google.com/search?&q=java+application+always+on+top
OscarRyz

Це просто і приголомшливо. Я також шукав щось подібне, але не знав, що вони реалізували це в Java 1.5. Дякуємо за розміщення.
Kushal Paudyal

2
На жаль, це не працює для мене під час запуску повноекранного додатку, такого як відеоігра. Хто-небудь знає про спосіб змусити його до вершини в цій ситуації?
Dream Lane

1
@Dream lane Я б, мабуть, поставив це як нове запитання
rogerdpack

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 Ну, це вірно. Зараз я вже не на зв'язку зі свінгом.
pinkpanther

Це чудово працює для мого випадку використання! Ключовим було повернення його до значення false.
рококо

0

не використовуйте setFullScreenWindow, просто отримайте розмір екрана, а потім setSize, і все буде добре.


Це відповідь чи коментар?
Невдалий вчений

@FailedScientist прославлений коментар
clankill3r
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.