Java и полноэкранный режим на нескольких мониторах
Фрагмент из моего 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, так как они объединены в одно (я нажал "расширить рабочий стол").
5 ответов
Вы можете попробовать:
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);
Более общее решение кода Эша состоит в объединении границ всех графических конфигураций.
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. Этот вид подразумевает ОДИН монитор.
Посмотрите этот другой ответ, который я сделал: JDialog не отображается в полноэкранном режиме
Это нормальное поведение, когда вы максимизируете окно в Windows, когда у вас есть два монитора. Чтобы два получили полный размер разрешения, вам нужно взглянуть на GraphicsConfiguration, чтобы проверить каждый GraphicsDevice.
Используя java.awt.Toolkit, вы можете получить полный размер экрана (все мониторы):
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dim = tk.getScreenSize();