【问题标题】:Bring JFrame window to the front将 JFrame 窗口置于最前面
【发布时间】:2016-01-06 16:09:42
【问题描述】:

显然,这个问题已经存在here。而over here 也有人回答了类似的问题。但是,我尝试了这两种方法(正如我所指出的),但似乎都不适合我。我在 Windows 10 上使用 Java 8 Update 22,而最后一篇文章的海报不在 Windows 和 Java 7 上,所以也许其中一件事情与它有关。我试过的代码,getInstance() 是我的 JFrame 对象:

private static void bringToFront() {                                                             
    getInstance().setVisible(true);                                                              
    getInstance().setExtendedState(JFrame.NORMAL);                                               
    getInstance().toFront();                                                                     
    getInstance().repaint();                                                                     
}

And taken from this answer.

private static void bringToFront() {
    getInstance().setVisible(true);
    getInstance().toFront();
    getInstance().requestFocus();
    getInstance().repaint();
}

@Override
public void toFront() {
    int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;

    super.setExtendedState(sta);
    super.setAlwaysOnTop(true);
    super.toFront();
    super.requestFocus();
    super.setAlwaysOnTop(false);
}

请注意,我确实希望窗口始终保持在顶部。但是,使用最后一个 sn-p 它确实保持在顶部。

编辑:我现在意识到它并不总是保持领先。问题是它的窗口最初出现在顶部,但没有焦点(任务栏中的图标闪烁),这意味着如果用户单击窗口以外的其他位置,窗口将保持在顶部,因为它不是不要“失去焦点”,因为它没有任何开始。我试过requestFocus(),但也没有用。可能是因为this explanation。如何确保窗口聚焦于初始弹出窗口?


我尝试了 mKorbel 的解决方案,但也没有用。它仅在窗口已经出现并被激活和取消激活并且当 then 方法被调用时,窗口来到前面时才起作用。但是,当第一次初始化窗口时,它不会显示在前面。

private static void bringToFront() {
    getInstance().setVisible(true);
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            getInstance().toFront();
        }
    });
    getInstance().requestFocus();
    getInstance().repaint();
}

【问题讨论】:

  • 再次 JFrame 忽略 toFront(基于来自 Native OS 的对等体)此功能保留自 JDialog/JWindow(具有模态和 alwaysInTop 等)、getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;适用于 JFrame 的单个实例,然后将此容器移动到屏幕的前面(向前,例如 Chrome ...)
  • you can to test,适用于我从 WinXP 到 Win10,包括。带有 GUI 的服务器版本 (2008/2012)
  • @mKorbel 非常感谢您试图向我解释这一点,但我真的不明白您在说什么。从您链接到的示例中,我只知道您在 JFrame 上使用它(这对我不起作用;我不能使用图标化 -> 正常,请参阅我的链接问题):frame.setExtendedState(Frame.ICONIFIED); frame.setExtendedState(Frame.NORMAL); frame.setAlwaysOnTop(true); frame.setAlwaysOnTop(false);
  • Focus是异步的,必须包裹在invokeLater中,不会在屏幕上闪烁,通过定时器偶尔闪烁
  • @mKorbel 查看我的编辑。我按照您的建议尝试了,但这也不起作用。如果这不是您的意思,请使用您认为可行的代码添加答案。谢谢。

标签: java swing


【解决方案1】:

这是我在下面使用的。

警告:YMMV!我完全不保证它会起作用,如果它起作用,它可能无法在另一个操作系统、同一操作系统的不同版本、您的 JAVA 版本或土星与木星对齐时等运行。

这里是:

private void hackyToFront( )
{
    // What follows is a hack to make sure that the frame is put to front and activated.
    // Simply calling setVisible( true ) and toFront( ) is not enough.

    SwingUtilities.invokeLater( new Runnable( )
    {
        @Override
        public void run( )
        {
            if( !isVisible( ) )
                setVisible( true );
            setExtendedState( JFrame.NORMAL );
            toFront( );
            setAlwaysOnTop( true );
            try
            {
                final Point oldMouseLocation = MouseInfo.getPointerInfo( ).getLocation( );

                // simulate a mouse click on title bar of window
                Robot robot = new Robot( );
                robot.mouseMove( getX( ) + 100, getY( ) + 10 );
                robot.mousePress( InputEvent.BUTTON1_DOWN_MASK );
                robot.mouseRelease( InputEvent.BUTTON1_DOWN_MASK );

                // move mouse to old location
                robot.mouseMove( (int) oldMouseLocation.getX( ), (int) oldMouseLocation.getY( ) );
            }
            catch( Exception ex )
            {}
            finally
            {
                setAlwaysOnTop( false );
            }
        }
    } );
}

【讨论】:

  • 谢谢!为我工作!
【解决方案2】:

可能的解决方案:

private static void bringToFront() {                                                             
   getInstance().setVisible(true); 
   getInstance().setFocusable(true);
   getInstance().requestFocus();
}

【讨论】:

  • 当我阅读其余的 cmets 时,我认为您需要提供更多您拥有的代码。你试图把窗户带到前面,你有没有关过它?如果是,是否设置了 setDefaultCloseOperation()?
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多