【问题标题】:How to set window always on top of any other applications如何始终在任何其他应用程序之上设置窗口
【发布时间】:2016-04-01 14:39:43
【问题描述】:

我有一个需要始终位于其他应用程序之上的 JFrame。为此,我正在使用Window 类的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() 方法不起作用。

我需要的是任何能让我的应用程序始终处于领先地位的方法。

我还在 stackoverflow 上搜索了许多其他相关帖子,但似乎没有一个回答我的问题。我也尝试过其他方法,例如覆盖windowDeactivated(WindowEvent e) 方法

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

但这也不起作用。

除了全屏应用程序之外,还有什么其他方法可以让我的 JFrame 始终位于所有其他应用程序之上

【问题讨论】:

  • 这取决于操作系统,您无法控制它。当两个窗口设置为alwaysOnTop 时,(来自Java)是不可预测的,哪个窗口实际上更高
  • JFrame 完全忽略了 setAlwaysOnTop(),这是关于基本的 JDialogs 功能
  • “但是当我的 java 应用程序超过任何已经在顶部的应用程序时,例如任务管理器。然后方法 setAlwaysOnTop() 不起作用” ..让你吃惊?!?令我惊讶的是,任何人都希望 x-plat 插件在“始终处于领先地位”方面做很多“战斗”..
  • @MadProgrammer 那么除了使用本机api之外,还有其他方法可以实现这一点。
  • @PankajPrakashh 我也看不到解决问题的本机解决方案

标签: java swing jframe window


【解决方案1】:

这取决于操作系统。一般来说,你不能保证你的窗口在原生窗口中总是在最前面,你也不应该。任务管理器始终处于最佳状态是有充分理由的。

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

【讨论】:

  • 我知道任务栏总是在顶部有一些很好的理由。但是,如果我需要我的 JFrame 位于已经位于顶部的其他应用程序的 顶部 怎么办。假设我正在创建一个桌面应用程序,由于某些安全原因或可访问性原因或其他原因,该应用程序需要放在首位。
  • @PankajPrakashh 安全原因是任务管理器位于首位的原因。无论如何,没有 Java 代码可以让您在所有操作系统上执行此操作。您可以尝试为此编写本机函数。我会注意到实际上 在 Windows(至少 7 或更低版本)上可以让窗口始终在顶部,但它也会一直占据焦点,所以它有点恶意,因为您将失去与其余窗口的交互。
猜你喜欢
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多