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.