2012-07-16 92 views
12

我正在编写一个应用程序,旨在在双显示器设置上运行,“显示器”JFrame在一个显示器上全屏显示,在另一个显示器上显示“控制”JFrame,向人机界面发送指令。我尝试了两种独立的方法来设置显示全屏;每个人的成功似乎取决于操作系统。Java setFullScreenWindow()保持在最前

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问题是一个简单的修复。是吗?

回答

10

尝试......

多种屏幕

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice[] gs = ge.getScreenDevices(); 


// Get size of each screen 

for (int i=0; i<gs.length; i++) { 
    DisplayMode dm = gs[i].getDisplayMode(); 
    int screenWidth = dm.getWidth(); 
    int screenHeight = dm.getHeight(); 
} 

使用public final void setAlwaysOnTop(boolean alwaysOnTop)为把最上面的窗口,如果窗口是可见的,这包括将窗口toFront,然后在“坚持”它到最高的位置。

+0

谢谢你的回答,但是我应该怎样处理来自for循环的宽度和高度值?我尝试使用'setAlwaysOnTop(true);',但是当我尝试它时不起作用。我有一个小时左右没有访问Windows,但我注意到你说“如果窗口是可见的,”所以也许我在设置窗口可见之前调用了它?我会尽快尝试,如果有效,请接受您的答案。 – BitFiber 2012-07-16 15:30:44

+0

编辑我的评论太晚了......但'setAlwaysOnTop(true);'在Windows中仍然不起作用。但是,我发现使用'System.getProperty(“os.name”);'来检查当前的操作系统是否是Windows,所以我可以使用'setExtendedState'方法。 – BitFiber 2012-07-16 16:05:49

+0

对不起,因为它没有为你工作,但感谢信息abt的工作.... – 2012-07-16 16:20:58

4

我遇到同样的问题。我解决它的方法是覆盖jframe中的show()函数,并且使用buffer strategy永远不会退出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,因为这将导致eventqueue无用,并使jframe忽略所有事件。函数show应在新线程中调用,然后所有事件仍将被处理。