Z moich obserwacji stwierdziłem, że przywilej AlwaysOnTop jest nadawany najnowszemu procesowi, który wymagał, aby być zawsze na szczycie.
Tak więc, jeśli masz aplikację, która setAlwaysOnTop(true)później inna aplikacja korzysta z tej opcji, uprawnienie jest nadawane drugiej aplikacji. Aby obejść ten problem, ustawiłem setAlwaysOnTop(false)i ponownie setAlwaysOnTop(true)za każdym razem, gdy jakieś okno pojawia się na górze bieżącego okna.
Sprawdziłem to wordwebw windows. WordWeb to jedna z aplikacji korzystających AlwaysOnTopz opcji zOS
Nie jestem pewien, czy to działa poprawnie w twoim scenariuszu gry.
Ostrzeżenie : nie jestem świadomy skutków ubocznych.
Oto przykład kodu:
import java.awt.event.*;
import javax.swing.*;
public class MainWindow extends JFrame implements WindowFocusListener
{
public MainWindow()
{
addWindowFocusListener(this);
setAlwaysOnTop(true);
this.setFocusable(true);
panel = new JPanel();
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){
setAlwaysOnTop(false);
setAlwaysOnTop(true);
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();}
}