Layout-Manager bei unterschiedlicher Auflösung verwenden


#1

Hallo,

ich habe eine kurze Frage an euch bezüglich des Layout-Manager.

Wenn ich Buttons auf einem JPanel platziere mit einem Layout, in diesem Fall einem Grid-Layout und ich das Programm auf unterschiedlichen PC‘s mit unterschiedlicher Auflösung ausführe, dann werden die Buttons vermutlich unterschiedlich groß dargestellt werden?

Die Frage die ich mir gerade stelle ist, ob die Buttons dann noch sauber angezeigt werden oder nicht?
Ich meine damit z.B. die Button beschriftung?

MfG


#2

Das kommt drauf an, wer der “Boss” ist :wink:

Man könnte da viele Details und Szenarien durchgehen, aber grundsätzlich:

Jede JComponent (d.h. auch eine JButton) hat die Methode getPreferredSize. Dort gibt sie die Größe zurück, die sie haben müßte, um “richtig” dargestellt zu werden. Ein button mit einem langen Text wird also eine große “Preferred size” zurückgeben. Ein button mit einem kurzen Text eine kleinere.

Diese getPreferredSize-Methode (und manchmal auch die analogen Methoden getMinimumSize und getMaximumSize) werden üblicherweise von einem Layout Manager verwendet, um das Layout zu berechnen.

(Das GridLayout ist dabei das einfachste. Dort sind alle Zellen gleich groß, und zwar so groß, wie die “preferredSize” der größten Component).

Diese Layoutinformationen werden “nach oben weitergereicht”. Wenn man also ein Panel mit GridLayout mit 2x2 Buttons hat, und die Buttons alle eine preferredSize von 50x50 haben, dann wird das gesamte Panel eine preferredSize von 100x100 haben.

“Ganz oben” ist der JFrame. Wenn man frame.pack() aufruft, versucht der Frame, seine preferredSize anzunehmen. Wenn er NUR das o.g. Panel enthält, würde dieser Frame also etwa 100x100 Pixel groß werden (+ Titelleiste und Rahmen). Dann werden alle Buttons in dem Panel richtig angezeigt. D.h. man kann ihre Beschriftung vollständig lesen.

Aber jetzt… kommt vielleicht der “Boss” - in diesem Fall, der User - und macht den Frame kleiner. Dann werden die Buttons schlicht zu wenig Platz haben (eben weniger als ihre preferredSize). Und dann werden die Button-Beschriftungen eben abgeschni...


#3

Das ist ein Problem.

Wie könnte ich das am besten Lösen, damit es auch bei anderen PC’s passt?

Ich habe das Programm auf einen PC mit einer recht hohen Auflösung programmiert und angepasst.

MfG


#4

Die Frage ist zu allgemein. Entweder es passt, oder es passt nicht. Wenn du das Fenster kleiner machst, siehst du, ob es passt. (Aber es ist schon ein Unterchied, ob man eine 1920x1080-Desktop-Anwendung oder eine 200x320-Nokia-Handy-“App” programmiert…)


#5

Ich kenne das Problem auch. Ich habe mal eine PDF-Vorlage in ein Bildschirm füllendes Programm umgesetzt. Das war nicht einfach. Letztendlich waren die Komponenten zu klein und ich musste mir überlegen, ob ich die Darstellung scrollen lasse, oder in Teilbereiche aufteile, um sie wieder in eine bedienbare Form zu bringen.
Es gibt sicher auch Anwendungsformen, bei denen man einfach bestimmte Hardwarevoraussetzungen haben muss. Ich denke da besonders an die Spieleentwickler und Gamer. Bei bestimmten Spezialanwendungen werden eben auch hochauflösende Bildschirme benötigt.
Aber manchmal genügt es einfach auch nur, das Bedienkonzept zu überdenken.

BTW: Zum GridLayout gibt es im Wiki einen kurzen Artikel.


#6

Das ist ein Megaproblem wenn man für Mobilgeräte programmiert, da macht es einen Unterschied ob das Programm auf einem 1920x1080px kleinen Smartphone läuft oder auf einem 1080x1024px größeren Tabletbildschirm.
Auflösung und Darstellungsgröße haben zueinander auch keine Beziehung.
Der 200x200px Button ist auf dem Smartphone winzig und auf dem Tablet gigantisch.

Webseitenentwickler können ein Lied davon singen.
Schlussendlich reicht ein Layout(-Manager) nicht um sie alle zu knechten. Für unterschiedliche Minima-Randbedingungen erstellst du unterschiedliche Layouts. Sprich für kleinere Bildschirme erstellst du einfach ein anderes - vielleicht abgespecktes - Layout.


#7

Vielleicht wäre mehr Kontext mal wieder hilfreich. Wenn es um Tablet und Smartphones geht: Bezieht sich das ganze auf Android? Dort ist die Welt ja anders, als in Swing, und das Problem, dass die gleiche Auflösung schlicht unterschiedlich groß dargestellt wird, wird ganz anders gelöst…


#8

Ich habe Mobilgeräte nur angeführt um aufzuzeigen wie das in Bereichen gemacht wird wo wir mit viel krasseren Dimensionen zu tun haben.

Computerbildschirme sind meistens alle irgendwie unkritisch groß genug.

Aber Webseiten - sprich HTML und CSS - müssen praktisch jedes denkbare Gerät abdecken. Und dort setzt man halt auf unterschiedliche Layouts.

Ich vermute das Javaman versucht alle Informationen auf einem Bildschirm darzustellen - wenn er auf einem hochauflösenden Bildschirm (2k? 4k?) entwickelt.
Dann muss man für kleinere Bildschirme halt weniger wichtige Inhalte ausblenden, weglassen oder zusammenfassen.
Ein Swing Layout Manager hilft auch nur begrenzt.


#9

Danke für eure Antworten, dass heißt eine einfache und optimale Lösung gibt es nicht mehr.

MfG


#10

Es gibt aber allgemeine Pi-Mal-Daumen-Regeln, wie man ein Layout am besten hinbekommt. Fast überall wird die Meinung vertreten, dass man mit dem kleinsten anzunehmenden Bildschirm anfangen soll (a.k.a. “Mobile first”), und sich dann auf größere Bildschirme vorarbeitet. Es ist oft vorteilhaft, die grobe Aufteilung beizubehalten (“oben kommt die Tabelle und unten die Bedienelemente”), und nur die untergeordneten Teile anzupassen (“ab 800 x 600 zeigen wir die erweiterten Bedienelemente mit Kolbenrückholfederauswahldialog an”). U.s.w.