Zum Inhalt springen

JLabel & Schriftgröße auf JFrame automatisch anpassen


Natriumarm

Empfohlene Beiträge

Hallo,

ich habe mal wieder ein Problem. Und zwar hab ich auf meinem Laptop (Auflösung ca. 1300x700) eine Applikation programmiert, die den gesamten Bildschirm einnimmt. Auf dem JFrame befinden sich ca. 30 - 40 JLabel mit Schrift & Bilder, zwei JTextfields etc.

Nun habe ich alles mit NullLayout programmiert und die Position, sowie Größe fest vorgegeben. Sieht auf dem Laptop gut aus, auf einem FULL HD Bildschirm natürlich nicht, da jede Menge ungenutzter Raum entsteht.

Wie kann ich das ganze so erweitern, dass es ungefähr gleich aussieht auf den unterschiedlichen Bildschirmauflösungen? Meine erste Idee war, die jeweilige Auflösung auszulesen und dann entsprechend dem Verhältnis zum Ursprung neuer Positionen und Größe berechnen. Erachte ich inzwischen aber als zu umständlich.

Gibt es eine Möglichkeit, alles automatisch anpassen zu lassen? Ausgeführt wird die Applikation immer im Vollbild. Möchte ungern für mehrere Auflösungen entsprechende JFrame zu programmieren.

MfG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun habe ich alles mit NullLayout programmiert und die Position, sowie Größe fest vorgegeben

Genau das ist dein Problem. Benutze einen entsprechenden Layout Manager.

A Visual Guide to Layout Managers (The Javaâ„¢ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)

Oder wenn dir diese Layout Manager nicht ausreichen:

JGoodies FormLayout | JGoodies

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erste Gehversuche mit dem gridbaglayout bringen eine Verbesserung, aber sind nicht so richtig einfach.

Oder anders gesagt, ich stell mir das Ganze in der Bedienung / Programmierung anders vor. Könnte ich festlegen, dass mein Layout IMMER genau 20 x 15 Zellen groß ist? Dann könnte ich genau sagen JLabel1 soll Zelle (0,0) haben und JLabel23 Zelle (19 & 20 breit und 14 & 15 hoch).

So in etwa stelle ich mir das vor - geht bestimmt nicht so oder?

Die Schriftgröße ändert sich auch nicht wirklich oder? Oder kann man vorgeben, dass der Text (eine Zahl, 45) sagen wir mal zu 90% die Zelle ausfüllt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber das ist doch genau das Grundkonzept hinter dem GridBagLayout? Du hast immer eine bestimmte Anzahl von Spalten und Reihen in denen die Komponenten angeordnet werden. Du gibt das zwar nicht direkt am Anfang an, aber solange du nur Komponenten in einem 20x15 Raster anlegst, ist dein Layout auch immer 20x15 Zellen groß. Und natürlich gibst du dann auch genau an, in welchen Zellen deine Komponenten sich befinden sollen.

Automatisch passt sich der Text soweit ich weiß nicht an, sowas kann man aber selber recht einfach programmieren:

java - How to change the size of the font of a JLabel to take the maximum size - Stack Overflow

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du könntest - wenn du bei null-layout bleiben willst - die doLayout()-methode deines JFrames überschreiben und die Bounds der Komponenten dort setzen. Wenn du es ganz einfach machen willst errechnest du einen Faktor um den die Auflösung gestreck wird, setzt dann deine Standard-Bounds, holst dir danach die Componenten vom JFrame und verzerrst die Bounds um diesen Faktor.

Das ist vielleicht (oder auch sicher) nicht ganz sauber und kein best practice, aber du solltest damit deine derzeitige Software mit überschaubaren Aufwand anpassen können.

Die Schriftgröße, kannst du genau so anpassen.


		float faktor = 1.5f;

		JTextField tf = new JTextField();

		tf.setFont(tf.getFont().deriveFont(faktor*tf.getFont().getSize()));

Link zu diesem Kommentar
Auf anderen Seiten teilen

Diesen Ansatz hatte ich auch. Danke Speedi.

Ich bin jetzt aber dazu übergegangen, das GridBagLayout für die gesamte Oberfläche zu verwenden und dann mehrere Panel iniklusive eigenen Layoutmanagern einzubinden.

Sieht im Moment noch nicht ansatzweise so "schick" aus wie ich es hatte, aber ich denke, auf lange Sicht die bessere Lösung.

Nun habe ich aber noch einige Fragen.

1)

Kann ich einem JLabel in einer Zelle eine feste Größe zuweisen? Weil im Moment richtet sich die Breite nach dem Inhalt. Sprich wenn eine "8" drin steht, ist die Zelle schmaler, als die Zelle nebenan mit "123". Aus "Designgründen" würde ich aber diese besagten Zellen alle gleich groß haben wollen.

2)

Kann ich dem JLabel einen Abstand zur nächsten Zelle geben? Einfach wäre zu sagen, die JLabel sollen nur 90% der gesamten Zelle ausfüllen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

1)

Kann ich einem JLabel in einer Zelle eine feste Größe zuweisen? Weil im Moment richtet sich die Breite nach dem Inhalt. Sprich wenn eine "8" drin steht, ist die Zelle schmaler, als die Zelle nebenan mit "123". Aus "Designgründen" würde ich aber diese besagten Zellen alle gleich groß haben wollen.

2)

Kann ich dem JLabel einen Abstand zur nächsten Zelle geben? Einfach wäre zu sagen, die JLabel sollen nur 90% der gesamten Zelle ausfüllen.

Ich finde der Umgang Gridbaglayout erfordert (zu) hohe Frustrationstoleranz, weil die Parametrisierung erstmal undurchschaubar ist und dauernd für Überraschungen sorgt. Deshallb empfehle ich das TableLayout, das praktisch dieselbe Funktionalität bietet, aber viel besser nachzuvollziehen ist.

Die Layoutmanager reagieren z.B. auf die Eigenschaft preferredSize. . Defaultmäßig ist die PreferredSize offensichtlich abhängig vom TextInhalt, deshalb ist es vielleicht ein gangbarer Weg, z.B. mittels FontMetrics eine Festbreite zu bestimmen und diese allen JLabels zu geben.

Den Rahmen um die Labels kann man z.B. in manchen LayoutManagern einstellen oder allgemein mittels setBorder(). Alternativ könnte man vielleicht auch eine neue Klasse abgeleitet von JPanel schreiben und den JLabel darin hineinpacken und auch die anderen Rahmendetails und Größenangaben. Viele Wege führen nach Rom, aber so würde ich es anpacken, wenn es nicht zu komplex werden soll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Frustrationstoleranz wurde schon des öfteren strapaziert. Ich bin meiner Ansicht nach auf dem richtigen Weg, aber so ganz kapier ich manchmal nicht, warum und vorallem nach welchen "Vorgaben" das GridBagLayout permanent nach Eingaben neu verschiebt.

Ich hab jetzt mehrfach gelesen, dass man mit MinimumSize, PreferedSize, MaxSize arbeiten kann:

jp_player_one_history.setMaximumSize(new Dimension (250,50));

jp_player_one_history.setMinimumSize(new Dimension (250,50));

jp_player_one_history.setPreferredSize(new Dimension (250,50));

Diese Angaben habe ich jetzt sowohl bei einigen JLABEL und auch bei einem JPANEL versucht, auf dem 5 JLABEL liegen und beide Variante haben mal NULL Einfluss. Auch einem JPANEL den constraint panel.ipadx = 400; mitzugeben bringt nichts.

Ich starte meine Anwendung später auf einer FULL HD Anzeige, da sieht das Ganze schon recht brauchbar aus. Aber wenn ich auf HD Ready starten muss oder auf dem Laptop sind einige JLABEL nur schmale Schlitze und blähen sich dann unverhältnismäßig auf, wenn Text / Zahlen rein kommen.

Das ganze nochmal einem reDesign zu unterziehen, hoffe ich vermeiden zu können, da der derzeitige Stand schon einige Arbeit & Nerven gekostet hat.

MfG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ganze nochmal einem reDesign zu unterziehen, hoffe ich vermeiden zu können, da der derzeitige Stand schon einige Arbeit & Nerven gekostet hat.

MfG

Wenn Du Dich unbedingt mit dem GridBagLayout quälen willst - viel Spaß. Ich meine, daß es das nicht wert ist, weil andere Layoutmanager absolut ausreichen.

Kleiner Tip: Mir ist aufgefallen, daß sogar die Reihenfolge der Parametrisierung (die Reihenfolge der Methodenaufrufe) beim GridBagLayout einen Riesen Unterschied machen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sagen wir es mal so, ich bin jetzt auf einem Stand, an dem es nur noch Kleinigkeiten sind, die mich wirklich stören - wie eben diese Minimalgröße bei einigen JLabel. Es muss ja auch dafür eine Lösung geben, die schneller oder weniger aufwendig ist, als alles wieder neu zu designen mit einem anderen Layoutmanager.

Das kann man machen, wenn eine Version 2 ansteht oder ich wieder Lust hab, was neues zu lernen. Aber momentan macht es mehr Sinn das vorhandene zu optimieren, weil eben schon viel zeitlicher Aufwand drin steckt.

Also ich hoffe auf Tips, die mich ans Ziel bringen. Danke schon mal.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...