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