带有Java的“ Always on Top” Windows


85

在Java中,是否有一种方法可以使窗口始终位于“始终位于顶部”,而不管用户是否将焦点切换到另一个应用程序?我已经搜索了整个网络,所有解决方案都倾向于使用具有本地绑定的某种JNI接口。确实这不是唯一的方法吗?..还是吗?

Answers:


159

尝试使用此类的方法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 );
    }
}

替代文字

即使未激活,窗口仍位于顶部


3
您会认为,对“ java应用程序始终在最前面”的简单搜索将获得此答案,但找不到它。谢谢。
拉普利·安德森

46
你猜怎么了。现在可以了!!:)它带您来到这里!google.com/search?&q=java+application+always+on+top
OscarRyz,2009年

这很简单而且很棒。我也在寻找类似的东西,但不知道他们在Java 1.5中实现了这一点。感谢您的发布。
Kushal Paudyal 09年

2
不幸的是,这在运行全屏应用程序(例如视频游戏)时对我不起作用。有谁知道在这种情况下将其推高的方法吗?
Dream Lane

1
@Dream lane我可能会问一个新问题
rogerdpack

11

从我的观察中,我发现AlwaysOnTop特权已授予要求始终位于最前面的最新进程。

因此,如果您有一个应用程序,setAlwaysOnTop(true)后来又有另一个应用程序使用此选项,则将特权授予第二个应用程序。为了解决此问题,我在任何窗口位于当前窗口顶部时都设置了setAlwaysOnTop(false)setAlwaysOnTop(true)

我已经检查了它wordwebwindows。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();}
    }

当另一个窗口出现在顶部时,再次将其设置为false和true听起来并不可行,原因很简单-如果另一个应用程序执行相同的操作怎么办?
Trejkaz 2015年

@Trejkaz好吧,这是一个正确的观点。我现在不再与秋千保持联系。
pinkpanther

这完全适合我的用例!首先将其设置为false是关键。
rococo

0

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


是答案还是评论?
失败的科学家

@FailedScientist赞美的评论
clankill3r
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.