«Всегда на высоте» Windows с Java
-
08-07-2019 - |
Вопрос
Есть ли в Java способ иметь окно, которое всегда находится сверху, независимо от того, переключает ли пользователь фокус на другое приложение?Я искал в Интернете и обнаружил, что все решения основаны на каком-то интерфейсе JNI с собственными привязками.Неужели это не единственный способ сделать это?..или это?
Решение
Попробуйте этот метод Window
сорт:
Window.setAlwaysOnTop(логическое значение)
Он работает так же, как и по умолчанию в диспетчере задач Windows:переключитесь на другое приложение, но оно всегда отображается сверху.
Это было добавлено в 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 );
}
}
Окно остается сверху, даже если оно не активно
Другие советы
Из моего наблюдения я обнаружил, что привилегия 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();}
}
не используйте setFullScreenWindow, просто получите размер экрана, а затем setSize, и все будет хорошо.