使用Java的“Always on Top”Windows

在Java中,有没有办法让一个窗口“始终在最前面”,而不pipe用户是否将焦点切换到另一个应用程序? 我search了网页,所有的解决scheme都倾向于使用本地绑定的某种JNI接口。 真的,这不可能是唯一的方法吗?或者是吗?

试试这个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 ); } } 

替代文字

即使不活动,窗口仍保持最高

从我的观察中,我发现AlwaysOnTop权限被赋予最后一个要求始终处于顶层的进程。

所以,如果你有一个应用程序setAlwaysOnTop(true) ,后来另外一个应用程序使用这个选项,那么这个特权被赋予第二个应用程序。 为了解决这个问题,我已经设置了setAlwaysOnTop(false)并且每当任何窗口出现在当前窗口的顶部时,再次设置setAlwaysOnTop(true)

我已经在windows使用wordweb进行了检查。 WordWeb是使用OS AlwaysOnTop选项的应用程序之一

我不确定它是否适合您的游戏场景。

警告 :我不知道副作用。

这是代码示例:

 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();} }