如何设置 window 始终位于任何其他应用程序之上

How to set window always on top of any other applications

我有一个 JFrame,它需要始终位于其他应用程序之上。为此,我使用 Window class 的 setAlwaysOnTop() 方法。

这是我的代码:

class Test1 extends JFrame {

    public Test1() {
        initComponents();
        setTitle("Top Window");
        setAlwaysOnTop(true);
    }


    private void initComponents() {
        jLabel1 = new JLabel();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel1.setText("I am a top most window");
        getContentPane().add(jLabel1, BorderLayout.CENTER);

        pack();
    }                     

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Test1().setVisible(true);
            }
        });
    }

    private javax.swing.JLabel jLabel1;
}

这适用于其他一些应用程序,例如记事本、资源管理器等,即当我的应用程序位于记事本之上时,一切正常。

但是当我的 java 应用程序超越任何已经在顶部的应用程序时,例如 任务管理器 。那么setAlwaysOnTop()这个方法就不行了。

我需要的是使我的应用程序始终位于最前面的任何方法。

我还在 Whosebug 上搜索了许多其他相关帖子,但 none 似乎回答了我的问题。我还尝试了其他方法,例如重写 windowDeactivated(WindowEvent e) 方法

addWindowListener(new WindowAdapter(){
    @Override
    public void windowDeactivated(WindowEvent e) {
        toFront();
        //requestFocus();
        //requestFocusInWindow();
    }
});

但这也不起作用。

有没有其他方法可以让我的 JFrame 始终位于所有其他应用程序之上 除了全屏应用程序。

这取决于操作系统。一般来说,你不能保证你的 window 在原生 windows 上总是排在首位,你也不应该。任务管理器始终处于最前面是有充分理由的。

我记得某些版本的 Vista 和更早的 Windows 系统允许这样做,而本机和 Java windows 最终争夺焦点。