将JFrame窗口放在前面

时间:2016-01-06 16:09:43

标签: java swing

显然,这个问题已经存在hereover 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);
}

请注意,我希望窗口始终保持最佳状态。然而,在最后一个片段中,它确实保持领先。

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

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

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

2 个答案:

答案 0 :(得分:3)

这是我在下面使用的内容。

警告: 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 );
            }
        }
    } );
}

答案 1 :(得分:0)

可能的解决方案:

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