«Всегда поверх» Windows с Java

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

Попробуйте этот метод classа 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

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

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

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

Я проверил его с 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();} } 

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

Давайте будем гением компьютера.