2009-12-20 3 views
11

Un extrait de mon application Java:java et sur plusieurs moniteurs plein écran

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

donc ce qu'il fait est de rendre l'auto en plein écran. Maintenant, la chose étrange est que le programme est en plein écran, mais seulement sur un moniteur! E.g. J'ai un système Windows Vista avec deux écrans qui sont combinés dans un seul bureau. Que faire automatiquement en mode plein écran sur tous les moniteurs?


Ok j'ai essayé:

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

mais il donne:

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 

Par exemple, je me attends à un dispositif capable de 2048x768 comme ils sont combinés en un seul (je cliqué sur " étendre bureau ").

Répondre

6

Vous pouvez essayer:

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

Cela devrait calculer la largeur totale de plusieurs écrans. Évidemment, il ne prend en charge que les écrans alignés horizontalement dans le formulaire ci-dessus - vous devez analyser les limites des configurations graphiques pour gérer les autres alignements de moniteurs (dépend de la façon dont vous voulez le rendre pare-balles).

Edit: Et puis définissez la taille de votre cadre: f.setSize(width, height);

+0

Je suis d'accord. Le comportement normal est de maximiser/plein écran dans un moniteur. Si vous avez un moniteur de bureau étendu peut couvrir seulement des rectangles "partiels" à l'intérieur du grand rectangle du bureau. Même ils ne pouvaient pas couvrir toute la zone de bureau (deux moniteurs en diagonale par exemple) donc vous devez trouver le grand rectangle de bureau et définir la taille manuellement. – helios

1

C'est le comportement normal lorsque vous agrandissez une fenêtre dans Windows lorsque vous avez deux moniteurs. Pour obtenir la taille de résolution complète, vous devez regarder GraphicsConfiguration pour vérifier chaque périphérique GraphicsDevice.

3

Ce n'est pas ce que « setFullScreenWindow » est pour. C'est vraiment pour les applications qui veulent un accès plus direct au framebuffer (meilleure performance) - comme un jeu 3D dans DirectX, par exemple. Ce genre de implique un moniteur.

Voir cette autre réponse que je l'ai fait: JDialog Not Displaying When in Fullscreen Mode

0

à l'aide java.awt.Toolkit vous pouvez obtenir la taille plein écran (tous les moniteurs):

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

D'après mon expérience, tout n'est pas vrai. Si vous entendez par tous les moniteurs la totalité de la dimension du bureau, c'est-à-dire. Je reçois les dimensions sur l'un des moniteurs avec ceci, plus précisément mon affichage principal. – andersoyvind

17

Une solution plus générale au code de Ash est à union les limites de toutes les configurations graphiques

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

Cela fonctionnera aussi bien pour les moniteurs alignés verticalement qu'horizontaux.