2016-01-06 94 views
1

显然,这个问题已经存在here。和over here有人回答类似。但是,我尝试了两种方法(正如我指出的那样),而且都不适合我。我在Windows 10上使用Java 8 Update 22,而最后一篇文章中的海报不在Windows和Java 7上,所以也许这些东西中的一个与它有关。代码我都试过了,其中getInstance()是我的JFrame对象:我做将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(); 
} 
+1

再次的JFrame忽略toFront(基于从本机OS对等体)本的funcionality从的JDialog /的JWindow(与模态和alwaysInTop等),getExtendedState()&〜JFrame.ICONIFIED&JFrame的保留。正常;适用于JFrame的单个实例,然后将此容器移动到屏幕的前端(例如,通过Chrome浏览器...) – mKorbel

+0

[您可以测试](http://stackoverflow.com/a/6139696/714968),适用于我从WinXP到Win10,包括。服务器版本(2008/2012)与GUI – mKorbel

+0

@mKorbel我真的很感激你试图向我解释这个,但我真的不明白你在说什么。从你链接到的例子我只知道你在JFrame上使用它(这对我不起作用;我不能使用iconified - > normal,请参阅我的链接问题): 'frame.setExtendedState(Frame.ICONIFIED) ; frame.setExtendedState(Frame.NORMAL); frame.setAlwaysOnTop(true); frame.setAlwaysOnTop(false);' –

回答

0

可能的解决办法:

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

这不起作用。 –

+0

当我阅读其余评论时,我认为您需要提供更多的代码。你试图把你带到前面的窗户,你有没有关闭它?如果是,setDefaultCloseOperation()是否已设置? – brainiac080195

2

这就是我下面使用。

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

谢谢!适合我! –