“Always on Top” Windows with Java
2022-08-31 11:07:58
在Java中,有没有办法让一个窗口“始终在顶部”,而不管用户是否将焦点切换到另一个应用程序?我搜索了 Web,所有解决方案都倾向于某种具有本机绑定的 JNI 接口。真的,这不可能是唯一的方法?..还是?
在Java中,有没有办法让一个窗口“始终在顶部”,而不管用户是否将焦点切换到另一个应用程序?我搜索了 Web,所有解决方案都倾向于某种具有本机绑定的 JNI 接口。真的,这不可能是唯一的方法?..还是?
试试这个类的这个方法:Window
Window.setAlwaysOnTop(boolean)
它的工作方式与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)
我已经检查过了。WordWeb是使用选项的应用程序之一wordweb
windows
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();}
}