我的Java应用程序中的代码段:
JFrame f = new JFrame();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
gd.setFullScreenWindow(f);
所以它的作用就是使其全屏显示。现在奇怪的是,该程序是全屏的,但只能在一台显示器上!例如。我有一个Windows Vista系统,其中两个屏幕组合在一个桌面上。如何使它在所有监视器上全屏显示?
确定,我尝试过:
import java.awt.image.ColorModel;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
class grdevs
{
public static void main(String [] args)
{
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for(GraphicsDevice curGs : gs)
{
GraphicsConfiguration[] gc = curGs.getConfigurations();
for(GraphicsConfiguration curGc : gc)
{
Rectangle bounds = curGc.getBounds();
ColorModel cm = curGc.getColorModel();
System.out.println("" + bounds.getX() + "," + bounds.getY() + " " + bounds.getWidth() + "x" + bounds.getHeight() + " " + cm);
}
}
}
}
但是它给出了:
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
例如,我希望一台能够将2048x768的设备组合在一起(我点击了“扩展桌面”)。
您可以尝试:
int width = 0;
int height = 0;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for (GraphicsDevice curGs : gs)
{
DisplayMode mode = curGs.getDisplayMode();
width += mode.getWidth();
height = mode.getHeight();
}
这应该计算多个屏幕的总宽度。显然,它仅支持上述形式的水平对齐的屏幕-您必须分析图形配置的边界以处理其他监视器对齐(取决于您要制作的防弹方式)。
编辑:然后设置相框的尺寸:f.setSize(width, height);
Ash代码的一个更通用的解决方案是合并所有图形配置的边界
Rectangle2D result = new Rectangle2D.Double();
GraphicsEnvironment localGE = GraphicsEnvironment.getLocalGraphicsEnvironment();
for (GraphicsDevice gd : localGE.getScreenDevices()) {
for (GraphicsConfiguration graphicsConfiguration : gd.getConfigurations()) {
result.union(result, graphicsConfiguration.getBounds(), result);
}
}
f.setSize(result.getWidth(), result.getHeight());
这既适用于垂直对齐的监视器,也适用于水平监视器。
这不是“ setFullScreenWindow”的用途。它确实适用于希望直接访问帧缓冲区(更好的性能)的应用程序-例如3D游戏在DirectX中所做的。这种暗示一个监视器。
这是当您有两个监视器时在Windows中最大化窗口时的正常行为。为了使两个具有完整分辨率,您需要查看GraphicsConfiguration来检查每个GraphicsDevice。
使用java.awt.Toolkit,您可以获得全屏尺寸(所有监视器):
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dim = tk.getScreenSize();