2009-12-20 7 views
11

A von meiner Java-Anwendung Code-Schnipsel:java & Vollbild über mehrere Monitore

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

Also, was es tut, ist es selbstVollBild machen. Nun, das Seltsame ist, dass das Programm Vollbild ist, aber nur auf einem Monitor! Zum Beispiel Ich habe ein Windows Vista System mit zwei Bildschirmen, die in einem Desktop kombiniert sind. Was kann ich tun, wenn ich es automatisch über alle Monitore im Vollbildmodus laufen lasse?


Ok Ich habe versucht, dass:

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

aber es gibt:

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 

Eg ich ein Gerät, das 2048x768 erwarten würde, wie sie in einem kombiniert werden (Ich habe auf " Desktop erweitern ").

Antwort

6

Sie könnten versuchen:

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

Dies sollte die Gesamtbreite von mehreren Bildschirmen berechnen. Offensichtlich unterstützt es nur horizontal ausgerichtete Bildschirme in der obigen Form - Sie müssten die Grenzen der Grafikkonfigurationen analysieren, um andere Monitorausrichtungen zu handhaben (hängt davon ab, wie kugelsicher Sie es machen wollen).

Edit: Und stellen Sie die Größe des Rahmens: f.setSize(width, height);

+0

Ich stimme zu. Normales Verhalten maximiert/Vollbild in einem Monitor. Wenn Sie einen erweiterten Desktop-Monitor haben, können Sie nur "teilweise" Rechtecke innerhalb des großen Desktop-Rechtecks ​​abdecken. Selbst sie konnten nicht den gesamten Desktop-Bereich abdecken (zwei Monitore diagonal mit Beispiel), also müssen Sie das große Desktop-Rechteck finden und die Größe manuell einstellen. – helios

1

Das ist das normale Verhalten, wenn Sie ein Fenster in Windows maximieren, wenn Sie zwei Monitore haben. Um die volle Auflösung zu erhalten, müssen Sie unter GraphicsConfiguration nach jedem GraphicsDevice suchen.

3

Das ist nicht das, was „setFullScreenWindow“ ist für. Es ist wirklich für Anwendungen gedacht, die einen direkteren Zugriff auf den Framebuffer wünschen (bessere Performance) - wie ein 3D-Spiel beispielsweise in DirectX. Diese Art von impliziert einen Monitor.

diese andere Antwort Siehe ich getan habe: JDialog Not Displaying When in Fullscreen Mode

0

Mit java.awt.Toolkit Sie die volle Bildschirmgröße erhalten (alle Monitore):

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

Aus meiner Erfahrung ist das nicht alles wahr. Wenn Sie bei allen Monitoren die gesamte Desktop-Dimension meinen, Ich bekomme damit die Maße auf einem der Monitore, genauer gesagt mein Hauptdisplay. – andersoyvind

17

Eine allgemeine Lösung für Ashs Code ist zu Verbinden Sie die Grenzen aller Grafikkonfigurationen

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

Dies funktioniert für vertikal ausgerichtete Monitore sowie horizontal.

Verwandte Themen