gpt4 book ai didi

java - 将 JFrame 窗口置于最前面

转载 作者:行者123 更新时间:2023-11-30 08:06:05 25 4
gpt4 key购买 nike

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

请注意,我希望窗口始终保持在顶部。但是,对于最后一个片段,它确实保持在顶部。

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


我试过 mKorbel 的解决方案,但也没有用。它仅在窗口已经出现并且已被激活和取消激活时起作用,并且当然后调用该方法时,窗口会出现在最前面。然而,当第一次初始化窗口时,它并没有显示在前面。

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

最佳答案

这是我在下面使用的。

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

关于java - 将 JFrame 窗口置于最前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34637597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com