2009-12-20 3 views
11

отрывок из моего приложения Java:Java и полноэкранный над несколькими мониторами

JFrame f = new JFrame(); 
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice gd = ge.getDefaultScreenDevice(); 
gd.setFullScreenWindow(f); 

Так что она делает это сделать его самостоятельно на весь экран. Теперь странно, что программа полноэкранная, но только на одном мониторе! . У меня есть система Windows Vista с двумя экранами, которые объединены на одном рабочем столе. Что делать автоматически, чтобы он шел в полноэкранном режиме на всех мониторах?


Ok Я попробовал:

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

ответ

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

Это должно рассчитать общую ширину нескольких экранов. Очевидно, что он поддерживает только горизонтально выровненные экраны в форме выше - вам придется анализировать границы графических конфигураций для обработки других выравниваний мониторов (зависит от того, насколько пуленепробиваемый вы хотите это сделать).

Edit: А затем установить размер вашего кадра: f.setSize(width, height);

+0

Согласен. Нормальное поведение - максимизация/полноэкранный режим на одном мониторе. Если у вас есть расширенный монитор рабочего стола, он может покрывать только «частичные» прямоугольники внутри большого прямоугольника рабочего стола. Даже они не могли охватить всю область рабочего стола (два монитора по диагонали на примере), поэтому вам нужно найти большой прямоугольник рабочего стола и задать размер вручную. – helios

1

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

3

Это не то, что «setFullScreenWindow» для. Это действительно для приложений, которые хотят получить более прямой доступ к фреймбуферу (более высокая производительность) - например, в 3D-игре в DirectX. Такой тип подразумевает ОДИН монитор.

Смотрите этот другой ответ, который я сделал: JDialog Not Displaying When in Fullscreen Mode

0

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

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

Из моего опыта это не все так. Если все мониторы вы имеете в виду все размеры рабочего стола, то есть. Я получаю размеры на одном из мониторов с этим, точнее, с моим основным дисплеем. – andersoyvind

17

Более общее решение кода Эша является объединение границ всех графических конфигураций

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

Это будет работать с вертикально выровненными мониторами, а также горизонтально.

Смежные вопросы