Java и fullscreen на нескольких мониторах

Отрывок из моего приложения 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, поскольку они объединены в один (я нажал на "расширить рабочий стол" ).

Ответ 1

Вы можете попробовать:

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

Ответ 2

Более общее решение для кода 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 не отображается в полноэкранном режиме

Ответ 4

Это нормальное поведение, когда вы максимизируете окно в Windows, когда у вас есть два монитора. Чтобы получить размер полного разрешения, вам нужно будет посмотреть GraphicsConfiguration, чтобы проверить каждую графическую схему.

Ответ 5

Используя java.awt.Toolkit, вы можете получить полный размер экрана (все мониторы):

    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension dim = tk.getScreenSize();