我正在编写一个旨在双显示器设置上运行的应用程序,其中“Display”JFrame在一台显示器上全屏显示,另一台显示器上显示“Control”JFrame,向显示器发送指令。我尝试了两种不同的方法来设置全屏显示;每个人的成功似乎取决于操作系统。
display.setUndecorated(true);
display.setExtendedState(JFrame.MAXIMIZED_BOTH);
适用于Windows,但JFrame隐藏在OS X和Linux的Dock /面板下。
我的另一种方法,利用
GraphicsDevice.setFullScreenWindow(display);
适用于我尝试的所有三种操作系统,但在Windows中,将控制窗口聚焦在另一台显示器上会使显示窗口隐藏,并调用
display.setAlwaysOnTop(true);
无法解决问题。我对GraphicsDevice
方法有点偏爱,因为我不必处理OS X或Linux中的问题,我希望Windows问题是一个简单的修复。是吗?
答案 0 :(得分: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
,然后将其“粘贴”到最顶部位置。
答案 1 :(得分: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
,因为这会使事件队列无效,并使jframe忽略所有事件。应该在新线程中调用函数show
,然后仍然会处理所有事件。