Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过java确定windows显示编号和/或布局_Java_Multiple Monitors - Fatal编程技术网

通过java确定windows显示编号和/或布局

通过java确定windows显示编号和/或布局,java,multiple-monitors,Java,Multiple Monitors,我有一个全屏java应用程序,将在Windows7机器上的8显示器数字看板类型显示器上运行。我需要能够在特定的物理监视器上显示内容。理想情况下,我希望显示器在显示属性->设置中按1-8顺序排列,但是许多拔掉/插入和重新排列的尝试都未能通过显示属性->设置以任何确定的顺序显示物理监视器。我可以很好地对它们进行重新排序,但是当我的java程序检索到显示器上的信息时,它并不符合windows配置的布局/顺序 GraphicsEnvironment ID返回Device0和Device1等字符串,但这些

我有一个全屏java应用程序,将在Windows7机器上的8显示器数字看板类型显示器上运行。我需要能够在特定的物理监视器上显示内容。理想情况下,我希望显示器在显示属性->设置中按1-8顺序排列,但是许多拔掉/插入和重新排列的尝试都未能通过显示属性->设置以任何确定的顺序显示物理监视器。我可以很好地对它们进行重新排序,但是当我的java程序检索到显示器上的信息时,它并不符合windows配置的布局/顺序


GraphicsEnvironment ID返回Device0和Device1等字符串,但这些字符串与显示属性中显示的Windows显示编号不匹配。例如,如果布局为7,4,1,2,3,4,5,6,我仍然返回设备0,设备1。。。其中设备0对应于识别的屏幕1(而不是左侧第一个屏幕7)。是否有方法查询操作系统以确定显示器的布局和/或在特定物理监视器上全屏显示的其他技术?

您可以获得屏幕相对于大型虚拟桌面的界限:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
for (GraphicsDevice gd : ge.getScreenDevices()) {
    Rectangle bounds = gd.getDefaultConfiguration().getBounds();
    System.out.println(bounds.toString());
}
对于我的设置,这将提供:

java.awt.Rectangle[x=0,y=0,width=1280,height=1024]
java.awt.Rectangle[x=1280,y=304,width=1280,height=720]
您可以使用此信息来确定它们的顺序。例如,如果您完全确定您的显示器处于良好的网格中,您可以在右上角的显示器上全屏显示,如下所示:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gdUpperRight = null;
Rectangle bUpperRight = null;
for (GraphicsDevice gd : ge.getScreenDevices()) {
    Rectangle b = gd.getDefaultConfiguration().getBounds();
    if (bUpperRight == null || b.x > bUpperRight.x || b.y > bUpperRight.y) {
        bUpperRight = b;
        gdUpperRight = gd;
    }
}

gdUpperRight.setFullScreenWindow(myFrame);

有趣的是,我想我只关注边界的高度/宽度,而不是虚拟显示的总体x/y。我已经有了在每个特定的图形设备上“全屏显示”的代码,排序是有问题的部分。在我的场景中,可以安全地假设每个安装将包含一组同质的监视器,其中所有监视器都具有相同的尺寸和方向,因此这种方法可能会奏效。我尝试过这种方法,但实际上效果很好。我为GraphicsDevices列表制作了一个比较器,其中它们比较gd.getDefaultConfiguration().getBounds()中的X。为了防止屏幕宽度按X排序不同,而不是计算每个预期大小或尝试创建映射,这似乎是一种简单且相对有效的方法来保持它们的有序。getBounds是否保证为不同的显示返回不重叠的矩形(在所有平台上)?i、 例如,返回的矩形中是否可以包含一个点用于多个显示?这不能保证。在某些平台上,可以使用重叠布局。查看本页底部的最后一个“ServerLayout”部分:在我的Peppermint Linux 10上,当我在显示设置中并排放置两个监视器时,Java将只看到一个图形设备,我还没有找到一种方法来获取关于各个屏幕的任何信息。。。