Swing Ermittlung der Bildschirmauflösung von Multi-Monitor-Systemen

jf

Bekanntes Mitglied
Hallo, ich möchte die Gesamt-Auflösung eines Multimonitor-Systems ermitteln. Genauer gesagt beöntige ich die Angaben, wo sich die äußersten Ecken befinden. Soweit mir bekannt, besitzt der primäre Monitor links oben die Position 0,0 - wenn man links und rechts noch einen weiteren Monitor besitzt, erhalt man folgende Positionen (angenommen alle Monitore haben 1000 Pixel in der Breite:

Links: -1000
Rechts: 2000

Wie ermittelt man dies unter Java? - ich habe nur Code gefunden, wie man den Monitor mit der größten Auflösung ermittelt:

Java:
        	// Test if each monitor will support my app's window
		// Iterate through each monitor and see what size each is
		GraphicsEnvironment ge      = GraphicsEnvironment.getLocalGraphicsEnvironment();
		GraphicsDevice[]    gs      = ge.getScreenDevices();
		Dimension           maxSize = new Dimension(0, 0);

		for(GraphicsDevice screen : gs) {
			DisplayMode dm = screen.getDisplayMode();
		     
		    // Update the max size found on this monitor
		    if (dm.getWidth() > maxSize.getWidth() && dm.getHeight() > maxSize.getHeight()) {
		    	maxSize.setSize(dm.getWidth(), dm.getHeight());
		    }

		    System.out.println(dm.getWidth() + " x " + dm.getHeight());
		}


Das nächste Problem wäre, wenn die Monitore unterschiedliche Größen besitzen, denn in diesem Falle enstehen nicht-sichtbare Bereiche innerhalt der Grenzen der äußersten Kanten. - Gibt es für die Arbeit mit solchen Dingen evtl. bereits vorgefertigte Bibliotheken?
 

irgendjemand

Top Contributor
also der ansatz mit GraphicsEnvironment ist schon mal nicht verkehrt ... aber ich denke da musst du dir schon selbst was zusammen basteln ... fertige libs welche gerade bei unterschiedlichen auflösungen eines multi-monitor-systems arbeiten gibt es *wenn überhaupt* sicher nur als propertiäre software für spezielle anwendungsfälle ... etwas universales ... und dann noch speziell für java ... denke nicht das du da um ein paar zeilen code herum kommst
 

jf

Bekanntes Mitglied
Ok, das Problem was ich dabei habe ist, dass ich nicht weiß, wie die Monitore angeordnet sind.
- Ich habe zwar deren Auflösung (Monitor1=1000px, Monitor2=1000px), aber ich weiß nicht, ob die Gesamt-Auflösung nun von -1000...1000 oder von 0...2000 geht - dies ist abhängig davon, ob der primäre Monitor links oder rechts steht (oder gar oben/unten!).
Noch komplizierter wird es, wenn die Monitore zueinander versetzt sind. Dies ist bei Monitoren unterschiedlicher Größe der Fall, wäre aber auch bei gleich großen Monitoren denkbar (auch wenn dies ein ziemlich schwachsinniges Setup wäre... ;)

Kennt sich hier jemand von euch aus?

[EDIT]Anstatt mich auf das GraphicsDevice zu konzentrieren, hätte ich mich mal lieber dem GraphicsEnvironment annehmen sollen: es bietet eine Methode .getMaximumWindowBounds() - ich glaube, damit bin ich schon mal ein Stück weiter. :D
Das mit den nicht sichtbaren Bereichen wird dann aber sicherlich noch ein harter Brocken. - Ideen und Anregungen sind daher herzlich willkommen! :)
[/EDIT]
[WR]Leider zu früh gefreut!!! ;(
.getMaximumWindowBounds() liefert auch nur die Auflösung des primären Monitors, rechnet dabei aber die Höhe der Taskleiste raus. - Es ist doch einfach zum Heulen!
Meiner Meinung nach ist dies ein Fehler der GraphicsEnvironment-Klasse: .getMaximumWindowBounds() sollte dem Namen nach auch wirklich die maximalen Grenzen, in welchen ein Fenster dargestellt werden kann, liefern![/WR]
[TIPP]Nun, es ist kein Fehler - dieses Verhalten ist in der Tat so gewollt. Mehrere Monitore werden nur unterstützt, wenn man Windows so einstellt, dass es auf alle Monitore zentriert wird (wahrscheinlich ist dann die Taskleiste auf beiden Monitoren zu sehen und beim Maximieren nutzen Fenster dann beide Monitore) - Weiß jemand, wie man das unter Windows so einstellen kann? ???:L[/TIPP]
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Die Anordnung und "Ausdehnung" der Monitior bekommt man z.B. mit getBounds() der GraphicsConfiguration des jeweiligen GraphicsDevice.

Weiß jemand, wie man das unter Windows so einstellen kann?
Das wird über die Einstellungen der Graphikkarte geregelt. Der Graphikkartentreiber liefert eine entsprechende Applikation zur Einstellung mit. zu erreichen z.B. über das Kontextmenü im Desktop --> Grafikeigenschaften... oder unter Eigenschaften des Desktop --> Einstellung --> Erweitert usw.
 

jf

Bekanntes Mitglied
Danke für diese Informationen. Leider habe ich ein Problem deinen Tipp anzuwenden: bei mir wird getBounds() nicht mit aufgelistet (siehe Anhang). Wenn es diese Eigenschaft wirklich gibt (Java 6 SE), dann wäre dies echt prima - schließlich könnte ich mir dann die äußeren Grenzen des gesamten Bildschirms selber zusammensuchen. :) Könntest du mir evtl. noch ein Code-Beispiel geben?
 

Anhänge

  • GraphicsConfiguration.png
    GraphicsConfiguration.png
    39,1 KB · Aufrufe: 50

Michael...

Top Contributor
bei mir wird getBounds() nicht mit aufgelistet (siehe Anhang). Wenn es diese Eigenschaft wirklich gibt (Java 6 SE), dann wäre dies echt prima - schließlich könnte ich mir dann die äußeren Grenzen des gesamten Bildschirms selber zusammensuchen. :)
Die get Methode liefert ja ein Array von GraphicsConfiguration Objekten. Nach meiner Erfahrung ist dieses Array nur mit einem Objekt befüllt und an diesem GraphicsConfiguration Objekt kannst Du getBounds() aufrufen. (s. API Doku)
 
M

mtheiss

Gast
Ich habe mit zwei Monitoren folgendes zweimal laufen lassen und dabei den sekundären Monitor vertikal verschoben.
Java:
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;


public class Test {
	public static void main(String[] args) {
		GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
		GraphicsDevice gs[] = ge.getScreenDevices();
		for (GraphicsDevice screen : gs) {
			System.out.println(screen.getDefaultConfiguration().getBounds());
		}
	}
}

Code:
java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
java.awt.Rectangle[x=-1280,y=176,width=1280,height=1024]


java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
java.awt.Rectangle[x=-1280,y=-523,width=1280,height=1024]
 

irgendjemand

Top Contributor
@TO
ich sagte doch >GraphicsEnvironment< ... NICHT >GraphicsDevice< ...
denn GraphicsEnvironment liefert auch auskunft über die positionen untereinander ... GraphicsDevice hingegen NUR die eigenschaften des monitors selbst ...

was das rausrechnen der taskleiste unter windows angeht : das ist auch völlig korrekt so ... denn wenn du ein fenster maximierst wird es ja nicht ÜBER die taskleiste gezeichnet ... sondern nur bis an deren begrenzung ...

genau so wenig kannst du ein nicht-maximiertes fenster über die taskleiste schieben ... entweder wird dann der teil "unter" der taskleiste verschwinden ... oder unter win7 und die taskleiste oben wird es so oder so maximiert ...

ergo : der von der taskleiste belegte "platz" kann NICHT zum darstellen anderer inhalte verwendet werden ...


da ich atm kein multi-screen setup habe kann ich leider nicht dierekt helfen ... aber wie ich bereits sagte : um die nicht sichtbaren bereich wirst du dich schon selbst kümmern müssen ... denn ich denke nicht das es dort bereits helper-klassen für java gibt

auch ist deine annahme falsch das die taskleiste "vergrößert" wird ...
die taskleiste wird stehts nur auf dem primären anzeigegerät dargestellt ... auf allen anderen screens hast du 100% der größe zur verfügung

*ja .. ich glaube MAC und einige window-manager unter unix stellen die "taskleiste" dann auch auf anderen screens dar ... aber unter windows ist das defintiv nur mit einem custom-desktop möglich*
 

Crian

Top Contributor
Ich habe mit zwei Monitoren folgendes zweimal laufen lassen und dabei den sekundären Monitor vertikal verschoben.
Java:
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;


public class Test {
	public static void main(String[] args) {
		GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
		GraphicsDevice gs[] = ge.getScreenDevices();
		for (GraphicsDevice screen : gs) {
			System.out.println(screen.getDefaultConfiguration().getBounds());
		}
	}
}

Code:
java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
java.awt.Rectangle[x=-1280,y=176,width=1280,height=1024]


java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
java.awt.Rectangle[x=-1280,y=-523,width=1280,height=1024]

Sehr schick. Bei mir kommt

Code:
java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
java.awt.Rectangle[x=-1280,y=82,width=1280,height=1024]

raus.
 

jf

Bekanntes Mitglied
Code:
java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
java.awt.Rectangle[x=-1280,y=176,width=1280,height=1024]

java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
java.awt.Rectangle[x=-1280,y=-523,width=1280,height=1024]
Ok, dein primärer Monitor ist rechts. Der linke ist kleiner und unten bündig mit dem Hauptmonitor.
Dann hast du ihn nach oben über den Hauptmonitor hinaus verschoben.

Code:
java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
java.awt.Rectangle[x=-1280,y=82,width=1280,height=1024]
Gleiches Szenario mit gleicher Auflösung. - Bei dir ist aber der Zweit-Monitor zentriert zum Hauptbildschirm.

Danke fürs testen... ;)
 

jf

Bekanntes Mitglied
@TO
ich sagte doch >GraphicsEnvironment< ... NICHT >GraphicsDevice< ...
denn GraphicsEnvironment liefert auch auskunft über die positionen untereinander ... GraphicsDevice hingegen NUR die eigenschaften des monitors selbst ...
Aber ich sagte doch auch, dass dies nicht funktioniert: bei >GraphicsEnvironment< dürfte nur die Methode getMaximumWindowBounds() in Frage kommen, die aber liefert wirklich nur den Arbeitsbereich des primären Monitors (es sei denn, der Grafiktreiber gaugelt Windows einen großen Monitor vor, welcher eigentlich aus mehreren kleineren besteht).

was das rausrechnen der taskleiste unter windows angeht : das ist auch völlig korrekt so ... denn wenn du ein fenster maximierst wird es ja nicht ÜBER die taskleiste gezeichnet ... sondern nur bis an deren begrenzung ...
Ja, aber ich interessierte mich eben für die äußeren Grenzen des ganzen Multi-Monitor-Systems - nicht aber für die Grenzen für maximierte Fenster im primären Monitor. Da hilft mir das Rausrechnen der Taskleiste und die getMaximumWindowBounds()-Methode reichlich wenig...

genau so wenig kannst du ein nicht-maximiertes fenster über die taskleiste schieben ... entweder wird dann der teil "unter" der taskleiste verschwinden ...
Doch: Topmost-Fenster wie z. B. den TaskManager

oder unter win7 und die taskleiste oben wird es so oder so maximiert ...
Echt? AeroSnap achtet nicht auf die Position der Taskleiste??? - Das ist ja hart! Typisch M$...
Danke für diese Info. :D

ergo : der von der taskleiste belegte "platz" kann NICHT zum darstellen anderer inhalte verwendet werden ...
Natürlich geht das: es gibt Topmost-Fenster, bei Vollbild-Anwendungen wäre es echt nervig, wenn das nicht ginge. Außerdem ist der Windows-Desktop, wie auch die Taskleiste selber nur ein Fenster, in dessen Device-Kontext man zeichnen kann, wenn man das will. (wobei dies bei Java evtl. nur über JNI/JNA möglich ist - da stecke ich noch nicht tief genug in Java drin, um dies genau sagen zu können)

da ich atm kein multi-screen setup habe kann ich leider nicht dierekt helfen ... aber wie ich bereits sagte : um die nicht sichtbaren bereich wirst du dich schon selbst kümmern müssen ... denn ich denke nicht das es dort bereits helper-klassen für java gibt
Ja, ich denke, dass bekomme ich schon hin. ;)

auch ist deine annahme falsch das die taskleiste "vergrößert" wird ...
die taskleiste wird stehts nur auf dem primären anzeigegerät dargestellt ... auf allen anderen screens hast du 100% der größe zur verfügung
Genau, wie ich sagte. - with one exception: on multi-screen systems where Windows should be centered across all displays


*ja .. ich glaube MAC und einige window-manager unter unix stellen die "taskleiste" dann auch auf anderen screens dar ... aber unter windows ist das defintiv nur mit einem custom-desktop möglich*
Michael... erwähnte als eine Möglichkeit den Grafiktreiber, wobei ich hier bei mir (Win7) seine Angaben leider nicht nachvollziehen konnte...
 

irgendjemand

Top Contributor
das letzte multi-monitor-system was ich mal hatte war noch zu zeiten von XP ... kann sein das sich da mitlerweile eineige geändert hat ... ist mir aber atm auch ziemlich egal ... 1600x900 20" reichen mir atm voll aus ... *auch wenn ich über einen 1080p ganz froh wäre*

was AeroSnap angeht : jop ... wenn die taskleiste am oberen rand ist ... dann kannst du ein fenster nur bis zur taskleiste nach oben ziehen und das fenster wird maximiert ... wenn du es nach unten ziehst passiert nichts ... *außer das man es so verschiebt das man mit der maus nicht mehr ran kommt xD*

auch was mit "zentrieren" des desktops über mehrere monitore gemeint ist ist mir rätzelhaft ...
soweit ich das selbst gesehen habe wird selbst bei AMD Eyefinity die taskleiste NICHT über den primären monitor hinaus angezeigt *wäre IMO auch ziemlich schwachsinnig bei einem setup bei dem es KEINE gemeinsame ebene gibt ... die taskleiste also nicht "gerade" wäre*
ansonsten klärt mich mal bitte wirklich auf ...

und das mit GraphicsEnvironment meinte ich auch etwas anderst : da du sagtest das du dich primär nur auf GraphicsDevice festgefahren hast , welches nun mal wirklich nur angaben zu einem logischen screen liefert , wollte ich dich eigentlichen darauf hinweisen das du ne ebene höher gehen musst um auch die relationen zwischen den screens betrachten zu können ...
das java selbst hier nichts geeignetes zur verfügung stellt war mir schon klar ... aber ein paar zeilen in denen man mit ein bisschen mathematik sich ein grobes bild über das setup machen kann sollte schon drin sein ...

was die TopMostWindow angeht : unter einem "normalen" win-system sollte es eigentlich auch beim taskmanager bleiben ...
jedes weitere programm was diese technik nutzt könnte sich theoretisch über den taskmanager legen ... was nicht im sinne von M$ ist als dieser ursprünglich als TopTopMost konzipiert wurde ...
aber da M$ mit der WinAPI dies ermöglicht -> selbst schuld wenns wer benutzt ...
und bei FullScreen ist es klar das die taskleiste "übermalt" wird ... sonst wärs ja auch kein full-screen

naja wie gesagt : grundsätzlich zielte der thread ja darauf ab das du wissen wolltest wie man sinnvoll mit nem multi-screen-setup umgeht ... einfache antwort : mit GraphicsEnvironment und n paar zeilen eigenem code ...
 

jf

Bekanntes Mitglied
das letzte multi-monitor-system was ich mal hatte war noch zu zeiten von XP ... kann sein das sich da mitlerweile eineige geändert hat ... ist mir aber atm auch ziemlich egal ... 1600x900 20" reichen mir atm voll aus ... *auch wenn ich über einen 1080p ganz froh wäre*
Size does matter! :D

was AeroSnap angeht : jop ... wenn die taskleiste am oberen rand ist ... dann kannst du ein fenster nur bis zur taskleiste nach oben ziehen und das fenster wird maximiert ... wenn du es nach unten ziehst passiert nichts ... *außer das man es so verschiebt das man mit der maus nicht mehr ran kommt xD*
Wenn ich es mir recht überlege, dann ist dieses Verhalten durchaus gerechtfertigt:
man zieht das Fenster ja an der Titelleiste (also oben), weshalb der Snap eben auch besser am oberen Bildschirmrand anstatt unten passieren sollte. - Die Taskleiste und deren Position ist an dieser Stelle wohl eher irrelevant...

auch was mit "zentrieren" des desktops über mehrere monitore gemeint ist ist mir rätzelhaft ...
soweit ich das selbst gesehen habe wird selbst bei AMD Eyefinity die taskleiste NICHT über den primären monitor hinaus angezeigt *wäre IMO auch ziemlich schwachsinnig bei einem setup bei dem es KEINE gemeinsame ebene gibt ... die taskleiste also nicht "gerade" wäre*
ansonsten klärt mich mal bitte wirklich auf ...
Zu dieser Funktion habe ich ja auch hier in den Grafikarten-Einstellungen nichts finden können...
Aber wenn wirklich der Grafiktreiber Windows nur einen Bildschrim vorgaukelt, dann wird es wohl nur mit gleichgroßen Displays funktionieren.

und das mit GraphicsEnvironment meinte ich auch etwas anderst : da du sagtest das du dich primär nur auf GraphicsDevice festgefahren hast , welches nun mal wirklich nur angaben zu einem logischen screen liefert , wollte ich dich eigentlichen darauf hinweisen das du ne ebene höher gehen musst um auch die relationen zwischen den screens betrachten zu können ...
Nun, mit GraphicsDevice bekomme ich aber die Relations-Information, nicht aber mit GraphicsEnvironment - ein Display gibt nämlich seine Grenzen wie folgt an (Beispiel):

Links: -1280px
Rechts: 0px
Oben: 0px
Unten: 1024px

=> damit steht das Display links vom primären Bildschirm.

das java selbst hier nichts geeignetes zur verfügung stellt war mir schon klar ... aber ein paar zeilen in denen man mit ein bisschen mathematik sich ein grobes bild über das setup machen kann sollte schon drin sein ...
Ja, Mathematik ist da sicherlich kaum nötig.

was die TopMostWindow angeht : unter einem "normalen" win-system sollte es eigentlich auch beim taskmanager bleiben ...
jedes weitere programm was diese technik nutzt könnte sich theoretisch über den taskmanager legen ... was nicht im sinne von M$ ist als dieser ursprünglich als TopTopMost konzipiert wurde ...
Das ist halb so wild: man kann unter den TopMost-Fenstern genauso hin und her welchseln, wie zwischen normalen Fenstern.

aber da M$ mit der WinAPI dies ermöglicht -> selbst schuld wenns wer benutzt ...
Die API hat durchaus seinen Grund! - Ich nutze sie auch öfters. ;)
z. B. recht praktisch, wenn man Dateien per Drag'n'Drop entgegen nehmen will. (In diesem Falle ist das Fenster aber auch meist recht klein und stört damit die anderen recht wenig. Das Fenster wird dann in der Regel auch nur für die Zeit angezeigt, in welcher der Nutzer die Operation ausführen will.)

und bei FullScreen ist es klar das die taskleiste "übermalt" wird ... sonst wärs ja auch kein full-screen
Klar, das Problem ist aber das Gleiche: es liegt ein Fenster vor der Taskleiste! ;)

naja wie gesagt : grundsätzlich zielte der thread ja darauf ab das du wissen wolltest wie man sinnvoll mit nem multi-screen-setup umgeht ... einfache antwort : mit GraphicsEnvironment und n paar zeilen eigenem code ...
Ich bin nach wie vor der Meinung, dass man mit GraphicsDevice arbeiten muss (das es damit geht, sehe ich an meiner Anwendung). Ich bin mit GraphicsEnvironment allein nicht wirklich weiter gekommen. - Aber wenn du mir zeigst, wie du es meinst, dann lasse ich mich gern eines Besseren belehren. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
X Ermittlung des Physikalischen Hauptspeichers Allgemeine Java-Themen 19
M OOP Bildschirmauflösung des Systems ändern Allgemeine Java-Themen 0
Y Bildschirmauflösung ändern Allgemeine Java-Themen 5
L Kurzfristig Bildschirmauflösung ändern Allgemeine Java-Themen 2
A Bildschirmauflösung geändert - alle Bildschirminhalte verschoben - was tun? Allgemeine Java-Themen 7
E Bildschirmauflösung von Java aus ändern Allgemeine Java-Themen 3
G Bildschirmauflösung auslesen Allgemeine Java-Themen 2
K Bildschirmauflösung beim Kompilieren Allgemeine Java-Themen 16
T Bildschirmauflösung ändern Allgemeine Java-Themen 3
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
M Jdeps-Error durch multi-release Allgemeine Java-Themen 6
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
Luk10 Multi-Threading mit join() Allgemeine Java-Themen 16
M MessageFormat : multi line Allgemeine Java-Themen 10
Q JConsole - CPU Usage Multi-Core Allgemeine Java-Themen 2
T Java Logging API in Multi Threaded API Allgemeine Java-Themen 2
L remote debugging of a multi threaded system Allgemeine Java-Themen 2
G Framework für Multi-Prozessor-Programmierung? Allgemeine Java-Themen 4
G Java Anwendung für Multi-User Allgemeine Java-Themen 2
D Datei Suche: Multi Threaded Allgemeine Java-Themen 8
G Fehlerbereinigung bei Multi Threading Anwedung Allgemeine Java-Themen 2
M Bitte Testen: Mein Multi-File Editor Allgemeine Java-Themen 30
G Vectoren Threads, und Multi Operationen Allgemeine Java-Themen 15
A Synchronisation Datenquelle und Anwendung (Multi-User) Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben