"Всегда на высоте" Windows с Java
в Java есть ли способ иметь окно, которое "всегда сверху", независимо от того, переключает ли пользователь фокус на другое приложение? Я искал в интернете, и все решения опираются на какой-то интерфейс JNI с собственными привязками. Неужели это не может быть единственным способом сделать это?.. или это так?
3 ответа:
из моего наблюдения я обнаружил, что привилегия 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();} }