Java setFullScreenWindow()保持在最顶层

我正在编写一个旨在双显示器设置上运行的应用程序,其中“Display”JFrame在一台显示器上全屏显示,另一台显示器上显示“Control”JFrame,向显示器发送指令。 我尝试了两种不同的方法来设置全屏显示; 每个人的成功似乎都取决于操作系统。

display.setUndecorated(true); display.setExtendedState(JFrame.MAXIMIZED_BOTH); 

适用于Windows,但JFrame隐藏在OS X和Linux的dock / panels下。

我的另一种方法,利用

 GraphicsDevice.setFullScreenWindow(display); 

适用于我尝试的所有三个操作系统,但在Windows中,将控制窗口聚焦在另一台显示器上会使显示窗口隐藏,并调用

 display.setAlwaysOnTop(true); 

不解决问题。 我有点偏向GraphicsDevice方法,因为我不必处理OS X或Linux中的问题,我希望Windows问题是一个简单的修复。 是吗?

尝试这个…

对于多屏幕

 GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); // Get size of each screen for (int i=0; i 

使用public final void setAlwaysOnTop(boolean alwaysOnTop)将窗口置于顶部,如果窗口可见,则包括将窗口toFront ,然后将其“粘贴”到最顶部位置。

我遇到了同样的问题。 我解决它的方法是覆盖jframe中的show()函数,并使用缓冲策略永远不会返回show函数。 因此这样的事情:

  @override public void show(){ super.show(); //Create a double buffering strategy createBufferStrategy(2); BufferStrategy bs = getBufferStrategy(); while(true){ //draw our frame Graphics g = bs.getGraphics(); paint(g); //dispose of our graphics g.dispose(); //Show our frame bs.show(); try{ //Don't use all our cpu-power Thread.sleep(10); }catch(Exception e){ //Do something (this probably will never happen) } } } 

如果使用setVisible(boolean)而不是show()show不推荐使用),实际上会更好。 窗口不会始终位于顶部(您仍然可以在其上方拖动另一个窗口),但是当您将焦点放在另一个窗口时它不会自动隐藏。 这就是你想要的行为。

注意:不要在事件队列中调用show ,因为这会使事件队列无效,并使jframe忽略所有事件。 应该在新线程中调用函数show ,然后仍然会处理所有事件。