使用 Java 的“始终在顶部”Windows

Posted

技术标签:

【中文标题】使用 Java 的“始终在顶部”Windows【英文标题】:"Always on Top" Windows with Java 【发布时间】:2010-09-22 19:31:32 【问题描述】:

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

【问题讨论】:

【参考方案1】:

不要使用setFullScreenWindow,只要获取屏幕大小然后setSize,一切都会好的。

【讨论】:

是回答还是评论? @FailedScientist 美化评论【参考方案2】:

试试Window类的这个方法:

Window.setAlwaysOnTop(boolean)

它的工作方式与 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 );
    

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

【讨论】:

你会认为简单搜索“java application always on top”会得到这个答案,但找不到。谢谢。 猜猜看。现在可以了!! :) 它把你带到这里! google.com/search?&q=java+application+always+on+top 这很简单而且很棒。我也在寻找类似的东西,但不知道他们在 Java 1.5 中实现了这个。感谢发帖。 不幸的是,在运行全屏应用程序(如视频游戏)时,这对我不起作用。任何人都知道在这种情况下有一种方法可以将其推向顶峰吗? @Dream Lane 我可能会问这个问题【参考方案3】:

根据我的观察,我发现 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();
    

【讨论】:

当另一个窗口出现在顶部时再次将其设置为 false 和 true 听起来不是一个可行的解决方案,原因很简单 - 如果另一个应用程序做同样的事情怎么办? @Trejkaz 嗯,这是一个有效的观点。我现在不再和 Swing 联系了。 这非常适合我的用例!首先将其设置回 false 是关键。

以上是关于使用 Java 的“始终在顶部”Windows的主要内容,如果未能解决你的问题,请参考以下文章

flex 4 - 保持元素/组件始终在顶部

当父级打开模式对话框时,有没有办法自动隐藏始终在顶部的无模式对话框?

设置 browserWindow 始终在顶部,即使其他应用程序/游戏全屏 [Electron,Windows 操作系统]

IOS禁用Tab bar顶部的触摸区域

如何让Android模拟器始终在macOS中保持领先

保持启用的复选框在 jQuery DataTables 的顶部,尽管排序顺序