Swing GUI an Auflösung und Bildschirmgröße anpassen

MayR42

Mitglied
Hallo zusammen und ein gesundes neues Jahr!

Ich arbeite gerade an einer GUI, die auf verschiedenen Systemen mit unterschiedlichen Auflösungen und Bildschirmgrößen laufen soll. Die GUI soll in Swing umgesetzt werden. Zudem würde ich den GridBayLayout verwenden, um mir die Elemente wunderbar anzuordnen. Jetzt aber zum Problem....

Beispiel:
GUI wird für/auf einem Full-HD 24 Zoll Bildschirm entworfen und sieht da wunderbar aus. Startet man die GUI auf einem 4k 15 Zoll Bildschirm sind die einzelnen Elemente mit Beschriftung winzig.
Zudem kann man bei einigen OS's einen Skalierungsfaktor einstellen, der das ganze auch noch beeinflussen kann.

Jetzt habe ich überlegt, die Anzeigedaten zu ermitteln und daraufhin meine GUI zu skalieren (Schriftgrößen usw.). Die Anordnung der Elemente übernimmt ja zu Glück der Layoutmanager.

Mit Toolkit kann man ja über getScreenSize und getScreenResolution einige Anzeigedaten ermitteln. Ich habe mir mal die Werte für mein Bildschrim 15,6'' 3840x2160 Win10 ausgeben lassen:

Java:
groesseY = Toolkit.getDefaultToolkit().getScreenSize().height;
groesseX = Toolkit.getDefaultToolkit().getScreenSize().width;
aufloesung = Toolkit.getDefaultToolkit().getScreenResolution();

Bei 200% Skalierung bekomme ich:
aufloesung = 192
groesseY = 2160
groesseX = 3840

Bei 100% Skalierung bekomme ich:
aufloesung = 192
groesseY = 4320
groesseX = 7680

Warum wird mir eine falsche Auflösung ausgegeben? Müssten doch 282 sein. Und wieso verändert die Skalierung die Punkteanzahl?

Hat jemand Erfahrung mit so einem Problem? Was haltet ihr von meinem Lösungsansatz?

Viele Frage...😕
Danke schonmal im voraus
 
Hallo.

Vielleicht auch Interessant hier nachzulesen.

Da hat sich einiges geändert seit Java 9.

Wenn 192 DPI eingestellt ist, sollte auch 192 ausgegeben werden.
Siehe in den Anzeigeeinstellungen von Windows z. B.

Grüße
 
Zuletzt bearbeitet:
Es ist doch logisch, dass wenn du doppelt so groß skalierst, du nur noch die Hälfte der Pixel zur verfügung hast. Du brauchst ja nun 4 Pixel um vorher ein Pixel darzustellen. Die DPI ändern sich durch die Skalierung nicht. Das wäre auf fatal.

Was ich nicht verstehe ist, warum du dem User eine Schriftgrösse aufzwingen willst, bzw. eine Fenstergrösse. Wir sind doch hier nicht auf dem Smartphone. Die Frames sollten resizeable sein und die fontgrösse so, dass sie bei der kleinsten akzeptableren Größe (die du mit Festlegst, also z.b. 1024x768 oder wenn es sein muss 1280x1024) gut zu lesen sind. Die Schriftgrösse hat ja nichts mit der Bildschirmgröße zu tun. Bei größerem Fenster kann ich halt nur mehr Infos gleichzeitig sehen. Gibt es bei deiner gui keinen solchen Teil, wie z.b. Ein tableview, eine listigen, eine textarea oder ein Textfield, dann solltest du tatsächlich die Größe des Fenster fest an die benötigten Elemente anpassen und nicht resizable mache. Denn es bringt ja nichts ein größeres Fenster anzuzeigen nur damit die fonts größer werden. Der Informationsgehalt ändert sich dadurch ja nicht und es wird nur bildschirmplatz verschwendet.

Ich würde übrigens bei enormalesn Ui Elementen immer mit der systemFont size arbeiten, so dass sich dein Ui in die Einstellungen des Users integriert.

Gruß

Claus
 
@truesoul: Danke für den Link, sehr interessant. Ich bin wohl nicht der Einzige 😉

Es ist doch logisch, dass wenn du doppelt so groß skalierst, du nur noch die Hälfte der Pixel zur verfügung hast. Du brauchst ja nun 4 Pixel um vorher ein Pixel darzustellen. Die DPI ändern sich durch die Skalierung nicht. Das wäre auf fatal.

@Thallius: Verstehe ich nicht... Mein Bildschirm kann doch nur maximal 3840x2160. Wieso ermittelt das Toolkit bei 100% Skalierung groesseY = 4320 groesseX = 7680 und nicht 3840x2160. Und bei 200% Skalierung würde ich 1920x1080 erwarten.

Die Schriftgrösse hat ja nichts mit der Bildschirmgröße zu tun.
@Thallius: Das ist richtig. Aber die Auflösung macht das ganze für mich schwierig. Vierfache Auflösung bei gleichbleibender Bildschirmgröße bedeutet, dass die GUI-Größe durch vier geteilt wird und dadurch sehr klein ist.
 
Wer benutzt denn einen 4K 15“ Monitor für seinen PC? Und selbst wenn, dann ist dafür ja die Skalierung gedacht. Ich habe keine Ahnung wie das unter Windows läuft aber bei Apple wird bei den Retina Displays grundsätzlich nur die Viertel Auflösung für die UI benutzt und wenn du die volle Auflösung in deinem Programm benutzen willst, z.b. Um Bilder oder Videos anzuzeigen, dann Must du das explizit einschalten.

Gruß

Claus
 
@Thallius: 4K bei 15'' kann ich nur empfehlen. Wenn man einmal damit gearbeitet hat, will man es nicht mehr missen 😉

Durch meinen Bildschirm bin ich ja erst richtig auf dieses Problem gekommen.
 
Aber wie du gerade feststellst bringt es dir beim normalen arbeiten überhaupt nichts weil du die Schriften so gross skalieren Must das du sie wieder lesen kannst, dass du überhaupt keinen Vorteil aus der großen Auflösung ziehen kannst...
 
aber bei Apple wird bei den Retina Displays grundsätzlich nur die Viertel Auflösung für die UI benutzt
Nein, die Auflösung ist vom User wählbar.

Aber wie du gerade feststellst bringt es dir beim normalen arbeiten überhaupt nichts weil du die Schriften so gross skalieren Must das du sie wieder lesen kannst, dass du überhaupt keinen Vorteil aus der großen Auflösung ziehen kannst...
Ist btw nur ~20% kleiner als an dem von dir genannten Retina-Display...
 
Nochmals zurück zu meinem Problem...

Hat jemand Erfahrung mit dem Ermitteln der Bildschirmauflösung (mit Skalierungsfaktor) und der Bildschirmgröße?
Bei mir funktioniert es unter Windows ja nicht ganz nachvollziehbar (siehe oben).
 
Ich würde das "Problem" in dem Fall einfach ignorieren.
Mich als User würde es stören, wenn ich meinen Bildschirm runter skaliere, aber genau ein Programm sich dann gleichzeitig hochskaliert - entgegen meinen Einstellungen.
 
Ich würde das "Problem" in dem Fall einfach ignorieren.
Mich als User würde es stören, wenn ich meinen Bildschirm runter skaliere, aber genau ein Programm sich dann gleichzeitig hochskaliert - entgegen meinen Einstellungen.

@mrBrown:
Ich kann das Problem nicht ignorieren, da ohne Anpassung die Texte in der Anwendung auf einem 4K-Bildschirm kaum lesbar sind. Dem Anwender müsste ich dann zur GUI eine Lupe mitliefern 😵
 
Und alle Texte außerhalb der Anwendung sehen normal aus?

Dann hilft ein Update auf Java 9 oder Nutzung von Swing-Nachfolger JavaFX.
Händisch anpassen wird vermutlich nicht funktionieren - eben weil das Problem auch in AWT/Swing selbst steckt und diese nicht grad gut daran anzupassen sind.
 

Zurück
Oben