92

在 Java 中,有没有办法让一个窗口“始终在顶部”,无论用户是否将焦点切换到另一个应用程序?我在网上搜索过,所有解决方案都倾向于某种带有本机绑定的 JNI 接口。真的这不能是唯一的方法吗?......或者是吗?

4

3 回答 3

168

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

替代文字

即使不活动,窗口也会保持在顶部

于 2008-11-18T05:46:46.080 回答
11

根据我的观察,我发现 AlwaysOnTop 特权被赋予了要求始终在最前面的最新进程。

因此,如果您有一个应用程序,setAlwaysOnTop(true)然后另一个应用程序使用此选项,则该权限将授予第二个应用程序。为了解决这个问题,每当任何窗口出现在当前窗口的顶部时,我都会设置setAlwaysOnTop(false)and 。setAlwaysOnTop(true)

我已经用wordwebin进行了检查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();}
    }
于 2014-01-04T16:15:30.053 回答
0

不要使用setFullScreenWindow,只需获取屏幕尺寸然后setSize,一切都会好起来的。

于 2018-07-22T03:11:48.900 回答