Pakken org.eclipse.jface.resource definerer klasser som hjelper plugin-moduler med å styre ressurser for brukergrensesnitt, for eksempel fonter og ikoner.
Mange av arbeidsbenkens utvidelsespunkter tillater at plugin-moduler oppgir ikoner som kan brukes til å vise innhold i arbeidsbenken. Siden GUI-operativsystemer støtter et begrenset antall bilder og fonter i minnet på en gang, må plugin-grensesnittressurser håndteres med omhu og av og til deles mellom widgetene.
Vi har allerede sett flere referanser til ikoner i readme-verktøyet for plugin-modulen. Noen av ikonene er angitt i kodetypen 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 også sett kode som umiddelbart beskriver bilder. Følgende er fra readme-verktøyets 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 inneholder grunnleggende støtteklasser som gjør at plugin-moduler kan håndtere egne ikoner og fonter, uten å bekymre seg for når de tilsvarende grafikkobjektene for plattformen opprettes og slettes. Disse støtteklassene brukes direkte av plugin-moduler som vist ovenfor, eller indirekte når arbeidsbenken bruker disse klassene for å hente bilder som beskrives i kodetypen for utvidelsespunkt.
SWT-klassen Image representerer et bilde fra operativsystemperspektivet. Ettersom de fleste GUI-operativsystemer har begrensninger for hvor mange bilder som kan åpnes på en gang, må plugin-modulene opprette dem med omhu og sørge for at de slettes på riktig måte etter at de er brukt. Ved å bruke JFace-klassene ImageDescriptor og ImageRegistry i stedet for SWT-bildet, kan plugin-moduler vanligvis unngå å opprette, styre og slette disse bildene direkte.
ImageDescriptor-klassen kan brukes som en enkel beskrivelse av et bilde. Den angir alt som trengs for å opprette et bilde, for eksempel URLen til eller filnavnet på bildet. ImageDescriptors tildeler ikke et reelt plattformbilde, med mindre det er uttrykkelig bedt om dette med metoden createImage().
Bildedeskriptorer er den beste strategien når koden er strukturert på en slik måte at den definerer alle ikonene på ett sted og tildeler dem etter behov. Du kan når som helst opprette bildedeskriptorer uten tanke på operativsystemressurser. Dette gjør det enkelt å opprette alle i initialiseringskoden.
Klassen ImageRegistry blir brukt til å føre en liste over navngitte bilder. Klienter kan legge til bildedeskriptorer eller SWT-bilder direkte i listen. Når det kommer en forespørsel om et navngitt bilde til registeret, returnerer registeret bildet hvis det er opprettet, eller oppretter bildet fra deskriptoren. På denne måten kan registerklienter dele bilder.
Bilder som legges til i eller hentes fra registeret, må ikke slettes av klientene. Registeret håndterer sletting av bilder siden bildene brukes av flere klienter. Registeret kvitter seg med bildene når plattformens GUI-system avsluttes.
Når det er mulig angir du ikonet for plugin-modulens brukergrensesnittobjekter i filen plugin.xml. Mange av arbeidsbenkens utvidelsespunkter inkluderer konfigurasjonsparametere for en ikonfil. Ved å definere ikonene i utvidelsebidraget i plugin.xml, overalter du bildestyringen til plattformen. Siden ikonene vanligvis ligger i plugin-modulens katalog, kan du angi ikonene og styre filene på ett og samme sted.
De andre mønstrene bør bare brukes når du ikke kan angi ikonene som en del av utvidelsebidraget.
Det er mest hensiktsmessig med eksplisitt opprettelse når bildet sjelden blir brukt og når det ikke deles. Bildet kan opprettes direkte i SWT og slettes etter bruk.
Bilder kan også opprettes eksplisitt ved hjelp av en ImageDescriptor og aktivering av metoden createImage(). Også her må metoden dispose() brukes bare når det ikke lenger er behov for bildet. Hvis for eksempel en dialogboks oppretter et bilde når det åpnes, må bildet slettes når dialogboksen lukkes.
Når et bilde ofte blir brukt i en plugin-modul og deles på mange ulike objekter i brukergrensesnittet, er det nyttig å registrere bildedeskriptoren med en ImageRegistry. Bildene i registeret deles med alle objekter som ber om et bilde med samme navn. Du må ikke slette bilder i registeret siden de deles av andre objekter.
Det er best å legge til bildet i bilderegisteret hvis bildet er hyppig i bruk, kanskje hele tiden mens plugin-modulen er i bruk, og deles av mange objekter. Bakdelen med å bruke registeret er at registerbilder ikke slettes før GUI-systemet avsluttes. Siden det er begrenset hvor mange plattformbilder (SWT) som kan være åpne samtidig, bør ikke plugin-moduler registrere for mange ikoner i registeret.
Klassen AbstractUIPlugin inkluderer protokoll for opprettelse av bilderegister på tvers av plugin-moduler.
Når et ikon brukes hyppig til å vise elementer i en bestemt visning, kan det ved hjelp av en etikettleverandør deles mellom liknende elementer i visningsprogrammet. Etikettleverandøren håndterer retur av et bilde for et hvilket som helst objekt i et visningsprogram og kan dermed styre opprettelsen av bildet og dele bilder på tvers av objekter i visningsprogrammet.
Etikettleverandøren lage et bilde ved å bruke teknikkene vi har beskrevet tidligere. Hvis du blar gjennom de ulike implementeringene av getImage() i LabelProvider-subklassene, ser du at det brukes forskjellige teknikker, blant annet bufring av et enkelt ikon for objekter og vedlikehold av en bildetabell angitt etter type. Bilder som er opprettet av en etikettleverandør, må slettes med leverandørens dispose()-metode, som kalles når visningsprogrammet slettes.
Bruk av etikettleverandør er et kompromiss mellom eksplisitt opprettelse og bilderegisteret. Her deles ikoner, for eksempel i bilderegisteret, men likevel har man kontroll over opprettelse og sletting av det faktiske bildet.
Når en plugin-modul finjusteres, er det vanlig å prøve seg frem med alle disse ulike mønstrene for bildeopprettelse. Det kan være nyttig å legge avgjørelsen om bildeopprettelse i en separat klasse og be alle klienter om å bruke klassen for å hente alle bildene. På denne måten kan opprettelsessekvensen justeres slik at den gjenspeiler de faktiske ytelsesegenskapene i plugin-modulen.
Klassen ResourceManager brukes for bevare en tilordning av ImageDescriptors til bilder, slik at et bilde kan brukes på nytt ved å referere til det via deskriptoren. Når en deskriptor ber om et bilde fra registeret, returnerer registeret bildet hvis det er opprettet eller oppretter bildet fra deskriptoren. På denne måten kan registerklienter dele bilder.
Toppnivå ResourceManager er en DeviceResourceManager som opprettes i en visning. ResourceManager, som er definert av JFaceResources.getResources() , er en DeviceResourceManager og kan brukes som ResourceManager på toppnivå. Hvis du trenger en ResourceManager med kortere livssyklus enn DeviceResourceManager, kan du opprette en underordnet LocalResourceManager som du sletter etter bruk.
DeviceResourceManager slettes når visningen som brukes til å opprette den, slettes så det ikke er nødvendig med en spesialstyringskode.
Bilder som er lagt til eller hentet fra styreren, må ikke slettes av noen av klientene. Styreren håndterer sletting av bildet siden bildene brukes av flere klienter. Registeret sletter bildene når ResourceManager som bruker dem, slettes.
Fonter er en annen begrenset ressurs i plattformens operativsystem. Valgene rundt opprettelse og sletting av fonter er de samme som for bilder, og krever tilsvarende avveininger mellom hastighet/plass. Fonter tildeles vanligvis i SWT ved å be om en font med et plattformavhengig fontnavn.
FontRegistry-klassen har en tabell over fonter angitt etter navn. Den styrer tildeling og sletting av fonten.
Plugin-moduler bør vanligvis ikke tildele fonter eller beskrive fonter med plattformspesifikke navn. Selv om fontregisteret brukes internt i JFace, brukes det vanligvis ikke av plugin-moduler. JFaceResources-klassen bør brukes for å få tilgang til fellesfonter.
Det er vanlig å gi brukere tillatelse til å oppgi applikasjonsfontpreferanser på en preferanseside. I slike tilfeller brukes FontFieldEditor for å hente fontnavnet fra brukeren, og hvis fonten skal beholdes, brukes en FontRegistry. FontFieldEditor brukes bare på preferansesider.
JFaceResources-klassen styrer tilgang til felles plattformfonter og -bilder. Den opprettholder et internt font- og bilderegister slik at klienter kan dele navngitte fonter og bilder.
Det finnes en rekke forskjellige metoder i arbeidsbenken og andre plugin-moduler for å dele bilder. Bilderegisteret JFaceResources brukes relativt sjelden på tvers av arbeidsbenk- og pluginkoden.
Bruken av fonter er mye enklere. Arbeidsbenken og de fleste plugin-modulene bruker JFaceResources-klassen til å be om fonter angitt etter logisk navn. Metoder som getDialogFont() og getDefaultFont() er inkludert slik at plugin-moduler kan bruke forventede fonter i brukergrensesnittet.