Användargränssnittsresurser

I paketet org.eclipse.jface.resource definieras klasser som hjälper insticksprogram att hantera användargränssnittsresurser, t.ex. teckensnitt och ikoner.

Många av utökningspunkterna för arbetsmiljön medger att insticksprogram tillhandahåller ikoner som kan användas till att visa sitt innehåll i arbetsmiljön. Eftersom operativsystem med grafiska användargränssnitt bara kan hantera ett begränsat antal bilder eller teckensnitt i minnet måste användargränssnittsresurser för ett insticksprogram hanteras med omsorg och ibland delas mellan gränssnittskontroller.

Vi har redan sett flera referenser till ikoner i readme-verktyget för insticksprogram. Vissa av dess ikoner anges i märkordet plugin.xml.

<extension
   point="org.eclipse.ui.views">
	<category
	   id="org.eclipse.ui.examples.readmetool"
	   name="%Views.category">
	</category>
	<view
	   id="org.eclipse.ui.examples.readmetool.views.SectionsView"
	   name="%Views.ReadmeSections"
	   icon="icons/view16/sections.png"
	   category="org.eclipse.ui.examples.readmetool"
	   class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
	</view>
</extension>

Vi har också sett kod som beskriver bilder i förbifarten. Följande är hämtat från readme-verktygets ReadmeEditorActionBarContributor.

public ReadmeEditorActionBarContributor() {
      	...
	action1 = new EditorAction(MessageUtil.getString("Editor_Action1"));
	action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1"));
	action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE);
	action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE);
	...

JFace tillhandahåller de grundläggande supportklasser som gör att insticksprogram kan hantera sina ikoner och teckensnitt utan att behöva oroa sig för när motsvarande grafiska plattformsobjekt skapas och förstörs. Dessa supportklasser används direkt av insticksprogram på det sätt som visas här eller indirekt när arbetsmiljön använder dessa klasser för att hämta bilder som beskrivs i märkordet för utökningspunkten.

Bildbeskrivning och registret

SWT-klassen Image representerar en bild från operativsystemets perspektiv. Eftersom de vanligaste operativsystemen med grafiskt användargränssnitt har en begränsning av hur många bilder som kan vara öppna samtidigt bör insticksprogram vara mycket noga när de skapar bilder och se till att de också förstörs på rätt sätt när de är färdiganvända. Med hjälp av JFace-klasserna ImageDescriptor och ImageRegistry, i stället för SWT-bilden kan insticksprogram i allmänhet undvika att direkt skapa, hantera och förstöra dessa bilder.

Bildbeskrivning

Klassen ImageDescriptor kan användas som en lättviktsbeskrivning av en bild. Den anger allt som behövs för att skapa en bild, t.ex. URL-adressen eller filnamnet där bilden kan hämtas. ImageDescriptors allokerar inte en verklig plattform, om detta inte uttryckligen har begärts med createImage()-metoden.

Bildbeskrivning är den bästa strategin när koden är strukturerad så att den definierar alla ikonerna på ett ställe och allokerar dem vartefter de behövs. Bildbeskrivningar kan skapas när som helst utan tanke på operativsystemresurser, vilket gör det bekvämt att skapa alla i initieringskoden.

Bildregister

Klassen ImageRegistry används för att spara en lista över namngivna bilder. Klienter kan lägga till bildbeskrivningar eller SWT-bilder direkt i listan. När en bild begärs från registret med hjälp av namn, returneras bilden om den har skapats, eller så skapas en bild från beskrivningen. Detta gör att klienter i registret kan dela bilder.

Bilder som läggs till i eller hämtas från registret får inte förstöras av någon klient. Registret ansvarar för att förstöra bilden eftersom bilderna delas av många klienter. Registret förstör bilderna när plattformens grafiska användargränssnitt stängs av.

Insticksprogram för att använda bilder

Ange bilden i plugin.xml

Där det är möjligt anger du ikonen för insticksprogrammets användargränssnittsobjekt i filen plugin.xml. Många av arbetsmiljöns utökningspunkter inkluderar konfigurationsparametrar för en ikonfil. Genom att definiera ikonerna i utökningsinnehållet i plugin.xml låter du plattformen sköta bildhanteringsstratrategin. Eftersom ikonerna vanligen förvaras i insticksprogrammets katalog kan du ange ikonerna och hantera filerna på samma ställe.

De övriga mönstren bör bara övervägas om du inte kan ange ikonen som del av ditt utökningsinnehåll.

Skapa uttryckligen

Att uttryckligen skapa en bild är den bästa strategin när bilden inte används så ofta och när den inte delas. Bilden kan skapas direkt i SWT och förstörs när den har använts.

Bilder kan också skapas uttryckligen med hjälp av enImageDescriptor och createImage()-metoden. Precis som i första fallet måste dispose()-metoden anropas när bilden inte längre behövs. Om en dialogruta t.ex. skapar en bild när den öppnas, ska bilden förstöras när dialogrutan stängs.

Bildregister

När en bild används ofta i ett insticksprogram och delas över många olika objekt i användargränssnittet är det bra att registrera bildbeskrivningen med en ImageRegistry. Bilderna i registret delas med alla objekt som efterfrågar en bild med det namnet. Du får inte förstöra några bilder i registret eftersom de delas av andra objekt.

Att lägga till en bild i bildregistret är den bästa strategin om bilden används ofta, kanske under hela insticksprogrammets livstid, och delas av många objekt. Nackdelen med registret är att bilderna i registret inte förstörs förrän det grafiska användargränssnittet stängs av. Eftersom det finns en begränsning av hur många av plattformens bilder (SWT) som kan vara öppna samtidigt bör insticksprogram noga se till att inte för många ikoner registreras.

Klassen AbstractUIPlugin inkluderar protokoll för att skapa ett bildregister för insticksprogram.

Etikettproviders

När en ikon används ofta för att visa objekt i ett speciellt visningsprogram kan den delas mellan liknande objekt i visningsprogrammet med hjälp av en etikettprovider. Eftersom en etikettprovider ansvarar för att returnera en bild för objekt i ett visningsprogram kan den styra skapandet av bilden och eventuell bilddelning över flera objekt i visningsprogrammet.

Etikettprovidern kan använda alla de tidigare diskuterade teknikerna för att skapa en bild. Om du bläddrar genom olika implementationer av getImage() i underklasserna LabelProvider visas flera tillvägagångssätt, inklusive att cachelagra en enda ikon för objekt och underhålla en bildtabell efter typ.  Bilder som skapats av en etikettprovider måste förstöras med providerns dispose()-metod, vilken anropas när visningsprogrammet förstörs.

Att använda en etikettprovider är en bra kompromiss mellan uttryckligt skapande och bildregistret. Med den höjs ikondelningen som bildregistret, ändå bibehålls kontrollen över skapande och borttag av den verkliga bilden.

Bildklass för insticksprogram

När ett insticksprogram fintrimmas är det vanligt att experimentera med alla dessa olika mönster för att skapa bilder. Det kan vara bra att isolera beslutsfattandet beträffande bildskapande i en separat klass och instruera alla klienter att använda klassen för att få alla bilder. På det här sättet kan skapandesekvensen trimmas så att den speglar de verkliga prestandaegenskaperna för insticksprogrammet. 

ResourceManager

Klassen ResourceManager används för att behålla en avbildning av ImageDescriptors till Images så att en bild kan återanvändas när du refererar till den via dess beskrivning. När en bild begärs med hjälp av beskrivningen från registret returneras bilden om den har skapats, eller så skapas den från beskrivningen. Detta gör att klienter i registret kan dela bilder.

Resurshanteraren på översta nivån är en DeviceResourceManager vilken skapas vid en visning. Resurshanterare som definieras med JFaceResources.getResources() är en DeviceResourceManager och kan användas som resurshanterare på högsta nivån. Om du behöver en resurshanterare med en kortare livstid än DeviceResourceManager kan du skapa en LocalResourceManager som ett underordnat objekt och förstöra den när du är klar med den.

En DeviceResourceManager förstörs när visningen, som användes för att skapa den, förstörs så det behövs ingen speciell hanteringskod.

Bilder som läggs till i eller hämtas från hanteraren får inte förstöras av någon klient. Hanteraren ansvarar för att förstöra bilden eftersom bilderna delas av många klienter. Bilderna förstörs när aktuell resurshanterare förstörs.

Teckensnittsregister

Teckensnitt är en annan begränsad resurs i plattformens operativsystem. Problemen med att skapa och förstöra är desamma för teckensnitt som för bilder och kräver liknande kompromisser mellan hastighet och utrymme. I allmänhet allokeras teckensnitt i SWT genom att ett teckensnitt med ett plattformsberoende teckensnittsnamn begärs.

Klassen FontRegistry har en tabell över teckensnitt efter namn. Den hanterar allokering och borttag av teckensnittet.

I allmänt bör insticksprogram undvika att allokera teckensnitt eller beskriva teckensnitt med plattformsspecifika namn. Även om teckensnittsregistret används internt i JFace används det vanligen inte av insticksprogram. Klassen JFaceResources bör användas till att accessa vanliga teckensnitt.

Det är mycket vanligt att användarna kan ange sina inställningar för tillämpningens teckensnitt på en inställningssida. I dessa fall ska FontFieldEditor användas till att få teckensnittsnamnet från användaren och en FontRegistry kan användas till att behålla teckensnittet.  FontFieldEditor används bara på inställningssidor.

JFace-resurser

Klassen JFaceResources styr access till vanliga plattformsteckensnitt och -bilder. Den underhåller ett internt register över teckensnitt och bilder så att klienter kan dela namngivna teckensnitt och bilder.

Det finns många tekniker som används i arbetsmiljön och andra insticksprogram för att dela bilder där så behövs. Bildregistret JFaceResources används inte över hela arbetsmiljön och i insticksprogramkod.

Användningen av teckensnitt är mycket enklare. Arbetsmiljön och de flesta insticksprogram använder klassen JFaceResources för att begära teckensnitt efter deras logiska namn. Metoder som t.ex. getDialogFont() och getDefaultFont() tillhandahålls så att insticksprogram kan använda förväntade teckensnitt i sina användargränssnitt.