Java ImageIcon automatisch an Größe von JLabel anpassen

WhiZZler

Chancentod²
ID: 85586
L
6 Mai 2006
588
32
Begrüße!

ich programmiere momentan ein kleines schachspiel in java. das schachfeld wird durch einzelne JLabels dargestellt. die schachfiguren sind dann jeweils ImageIcons auf den JLabels. ich möchte nicht unbedingt eine feste größe für die einzelnen JLabels und dadurch im endeffekt auch für das gesamte fenster festlegen..

aktuell ist es so, dass wenn man die fenstergröße ändert sich natürlich auch die größe der JLabels ändert und die ImageIcons somit nicht mehr ganz angezeigt werden.. deswegen bin ich auf der suche nach einer möglichkeit, die größe der ImageIcons automatisch an die größe des JLabels anzupassen.. ich habe bereits gesucht, aber leider nur möglichkeiten gefunden, um das ImageIcon beim setzen auf das JLabel zu skalieren.. aber keine möglichkeit, um es bei jeder änderung zu skalieren..

gibt es so eine möglichkeit überhaupt? wäre für jegliche antworten, links oder sonstiges dankbar!

mfg
whizzler
 
Guten Morgen!

In Java wird sowas über ComponentListener geregelt, genauer gesagt aus dem ComponentListener die Methode "componentResized". Das sieht prinzipiell erstmal so aus:

Code:
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent evt) {
//hier irgendeine von Dir zu schreibende Methode aufrufen, die das Verändern der Größe übernimmt
}
});

Jetzt kannst Du das auf zwei Arten machen:
1.: Du hast eine übergeordnete Komponente, auf der alle JLabels liegen. Dann könntest Du den ComponentListener auf die übergeordnete Komponente (und sonst auf nichts) setzen und dann in der Methode über alle JLabels iterieren. Dazu müsstest Du noch in den JLabels "setSize" überschreiben, weil Du ja nicht nur die Größe des JLabels, sondern auch die des ImageIcons ändern willst.
2.: Du hast keine Möglichkeit, über die JLabels zu iterieren, dann könntest Du den ComponentListener auf jedes JLabel setzen (also innerhalb des jeweiligen JLabels im Konstruktor). Wenn Du dann eine entsprechende Methode zum Verändern der Größe innerhalb des JLabels aufrufst, brauchst Du natürlich auch nicht mehr setSize zu überschreiben, sondern kannst direkt auf das ImageIcon zugreifen.

Das ganze könnte halbwegs hinfällig sein: Ich hab keine Ahnung, ob bei Verwendung von LayoutManagern die JLabels automatisch in ihrer Größe verändert werden. In dem Fall würde es sogar ausreichen, setSize der JLabels zu überschreiben (dahingehend, dass auch die ImageIcons in der Größe verändert werden, sobald die JLabels in der Größe verändert werden), und überhaupt keine ComponentListener zu benutzen. Aber wie gesagt, das weiß ich nicht; müsstest Du mal ausprobieren. ;-)
 
danke für die antwort! die JLabels befinden sich in einem GridLayout. über die JLabels zu iterieren wäre deswegen kein problem..

wenn man die fenstergröße verändert, dann verändert sich automatisch auch die größe der JLabels.. ich werde also erstmal versuchen, die setSize() methode zu überschreiben.. falls das nicht funktioniert versuch ich es mit dem ComponentListener()

herrlich.. wieder mal nen bisschen was zum spielen ;)

edit: mit dem überschreiben der setSize() methode hatte ich wenig erfolg.. die wird beim ändern der größe nicht automatisch aufgerufen.. habe jetzt für das GridLayout, in dem sich die einzelnen JLabels für das schachbrett befinden einen ComponentListener() hinzugefügt.. in diesem iteriere ich über die einzelnen JLabels und passe dort die größe der icons an.. anfangs habe ich es so gemacht, dass jedesmal das gleiche icon skaliert wurde.. aber das sieht nen wenig nach karl arsch aus, wenn man nen bisschen mit der größe spielt.. deswegen wird jetzt jedesmal ein neues ImageIcon erzeugt, welches dann skaliert auf das JLabel gesetzt wird..

eventuell ändere ich es noch so, dass der ComponentListener() bei den JLabels registriert wird.. dann kann ich mir das iterieren sparen und direkt nur mit dem betroffenen JLabel arbeiten.. aber vorerst bin ich glücklich ;)

vielen dank nochmal für den hinweis!
 
Zuletzt bearbeitet: