Pluggable look and feel
Som nämndes i början av kursen har varje komponent en modell
och en UI delegate. Modeller har vi berört vid flera tillfällen,
nu är det dags att titta på vad UI delegate är. Varje komponent
har en egen UI delegate som har hela ansvaret för att rita komponenten
på skärmen. Tack vare att ansvaret för ritandet är
delegerat till ett specifikt objekt är det väldigt lätt att
förändra komponentens utseende, det är bara att ärva
lämplig UI delegate, ändra det som önskas och sedan använda
vår egen delegate istället. Det går också att ändra
hela applikationens utseende, till och med medan den exekverar, genom att
ange en ny look and feel. En look and feel är en komplett samling UI
delegates (och lite mer plattformsspecifika klasser) som ger applikationen
det utseende vi är vana vid från en viss plattform, till exempel
Windows. Förvisso går det att skriva en helt egen look and feel,
men det ligger definivt utanför den här kursen.
Byta look and feel
Klassen UIManager innehåller ett antal statiska metoder
för hantering av användargränssnittet, bland annat metoden
setLookAndFeel(). Om vi ändrar look and feel efter att applikationen
börjat rita på skärmen är det nödvändigt
att uppdatera alla komponenter. Lyckligtvis finns det en statisk metod,
SwingUtilities.updateComponentTree() som uppdaterar alla komponenter
i angiven komponent. Anropa alltså denna metod en gång för
varje rotfönster (vanligtvis JFrame eller JApplet),
se exemplet nedan.
Vilka look and feel kan vi välja mellan? Hittills har alla exemplet
använt Metal, som inte motsvarar någon speciell plattform.
Det finns dessutom Windows och Motif look and feel (och Mac, men den finns
bara i JRE för Mac). Här kommer ett exempel som kan växla
mellan Metal, Windows och Motif, ChangeLookAndFeel.java.
Men om vi vill att rätt look and feel ska sättas automatiskt
varje gång en applikation startar? Då skriver vi en fil vid
namn swing.properties och lägger den i katalogen jre\lib under den
katalog där J2SE är installerad. I den filen skriver vi raden
swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel (om
applikationen ska ha Windows-utseende).
Stöd för desktop propeties
Från 1.4 fökjer Swings look and feel många av de inställningar
användaren gör för sitt operativs look and feel ("desktop properties").
Detta gäller främst på Windows. En lista på vilka properties
swing kan hantera finns här, http://java.sun.com/j2se/1.4/docs/guide/swing/1.4/w2k_props.html.
Anpassa aktuell look and feel
Förutom de gamla hederliga metoderna i java.awt.Component
(till exempel setBackground(), setFont() osv) vilka ändrar
utseendet hos en specifik komponent, går det i Swing enkelt att
ändra utseendet hos alla komponenter av en viss typ. Klassen
UIManager har den statiska metoden put() som tar en
Look and Feel Resource och dess nya värde. Det finns flera hundra
olika Look and Feel Resource, alla är beskrivna i appendix A i boken
Java Swing (se litteraturlistan).
Här är ett exempel där utseendet hos alla internal frames,
scroll bars och knappar ändras på detta sätt, ResourceModExample.java. Önskad
look and feel resource måste sättas innan komponenten skapas.
Förändra en UI delegate
Du kan ändra hur en viss klass ritas på skärmen genom
att skriva om dess UI delegate. Ärv av lämplig klass (till exempel
MetalScrollBarUI om du vill ändra hur en scroll bar ritas
med Metal look and feel), omdefiniera de metoder du vill ändra i och
ange din nya klass som UI delegate för aktuell typ av komponent. UIManager.put(
"ScrollBarUI", "MyMetalScrollBarUI");anger att klassen MyMetalScrollBarUI
är default UI delegate för alla scroll bar.
Den eviga kaffekoppen
Ingen av ovanstående anpassningsmöjligheter har svaret på
den ständiga frågan "HUR SÄTTER JAG MIN EGEN IKON I EN
FRAME???". Det görs helt enkelt genom att skicka en Image
av storleken 16x16 pixlar till metoden java.awt.setIconImage(),
se exemplet TheNoCupFrame.java.