java和多屏全屏显示

问题描述 投票:13回答:5

我的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的设备组合在一起(我点击了“扩展桌面”)。

java swing fullscreen
5个回答
6
投票

您可以尝试:

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);


20
投票

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());

这既适用于垂直对齐的监视器,也适用于水平监视器。


3
投票

这不是“ setFullScreenWindow”的用途。它确实适用于希望直接访问帧缓冲区(更好的性能)的应用程序-例如3D游戏在DirectX中所做的。这种暗示一个监视器。

看到我做的另一个答案:JDialog Not Displaying When in Fullscreen Mode


1
投票

这是当您有两个监视器时在Windows中最大化窗口时的正常行为。为了使两个具有完整分辨率,您需要查看GraphicsConfiguration来检查每个GraphicsDevice。


0
投票

使用java.awt.Toolkit,您可以获得全屏尺寸(所有监视器):

Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dim = tk.getScreenSize();
© www.soinside.com 2019 - 2024. All rights reserved.