Paketissa org.eclipse.jface.resource määritetään luokat, joiden avulla lisäosat käsittelevät käyttöliittymän resursseja kuten fontteja ja kuvakkeita.
Useat työympäristön laajennuspisteet sallivat lisäosien toimittaa omia kuvakkeitaan, joita voidaan käyttää niiden työympäristöön tekemien lisäysten näyttämiseen. Koska graafisten käyttöjärjestelmien muistissa yhdellä kertaa olevien kuvien tai fonttien tuettu määrä on rajallinen, lisäosan käyttöliittymäresursseja täytyy hallita huolellisesti ja joissain tapauksissa määrittää ne widget-toiminnoille yhteiskäyttöön.
Olemme jo käsitelleet Readme-työkalulisäosassa olevia useita viittauksia kuvakkeisiin. Jotkin sen kuvakkeista on määritetty plugin.xml-merkinnöillä.
<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>
Olemme myös käsitelleet koodia, joka kuvaa kuvia "lennosta". Seuraava esimerkki on Readme-työkalun luokasta 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 sisältää perustukiluokat, joiden avulla lisäosat voivat hallita kuvakkeitaan ja fonttejaan huolehtimatta vastaavien ympäristön graafiikkaobjektien luonnista tai tuhoamisesta. Lisäosat käyttävät kyseisiä tukiluokkia joko suoraan ylläolevien esimerkkien kaltaisesti tai välillisesti, kun työympäristö käyttää kyseisiä luokkia laajennuspisteen merkintäkielellä kuvattujen kuvien poimintaan.
SWT-luokka Image edustaa kuvaa ympäristön perspektiivistä. Koska useimmissa graafisissa käyttöjärjestelmissä yhdellä kertaa auki olevien kuvien määrä on rajallinen, lisäosien tulee olla varovaisia luodessaan kuvia ja varmistaa, että kuvat myös poistetaan huolellisesti, kun niitä ei enää käytetä. Käyttämällä JFace-luokkia ImageDescriptor ja ImageRegistry SWT-luokan image sijaan lisäosat välttävät yleensä kuvien suoran luomisen, hallinnan ja poiston.
Luokkaa ImageDescriptor voidaan käyttää kuvan suppeana kuvauksena. Se määrittää kaikki tiedot, jotka vaaditaan kuvan luontiin, kuten URL-osoitteen tai tiedostonimen, josta kuva voidaan poimia. ImageDescriptor-luokat eivät varaa käyttöön todellista ympäristön kuvaa, ellei näin erityisesti pyydetä metodilla createImage().
Jos koodin rakenteessa kaikki kuvakkeet määritetään yhdessä paikassa ja niitä varataan käyttöön tarvittaessa, kuvien kuvaajien käyttö on paras tapa toimia. Kuvien kuvaajia voi luoda milloin tahansa huolehtimatta ympäristön resursseista. Kaikki kuvaajat on näin ollen kätevää luoda alustuskoodissa.
Luokkaa ImageRegistry käytetään pitämään yllä luetteloa nimetyistä kuvista. Asiakkaat voivat lisätä kuvien kuvaajia tai SWT-kuvia suoraan luetteloon. Kun kuvaa pyydetään nimellä rekisteristä, rekisteri palauttaa kuvan, jos se on luotu, tai luo kuvan kuvaajan perusteella. Näin kuvat ovat rekisterin asiakkaiden yhteiskäytössä.
Asiakkaat eivät saa poistaa rekisteristä noudettuja tai sinne lisättyjä kuvia. Rekisteri vastaa kuvan poistosta, koska kuvat ovat useiden asiakkaiden yhteiskäytössä. Rekisteri poistaa kuvat, kun ympäristön graafinen käyttöliittymä suljetaan.
Määritä lisäosan käyttöliittymäobjektien kuvakkeet plugin.xml-tiedostossa aina, kun se on mahdollista. Useat työympäristön laajennuspisteet sisältävät kokoonpanoparametreja kuvaketiedostolle. Kun kuvakkeet määrittää plugin.xml-tiedoston laajennuksen lisäykseen, kuvien hallintastrategia jää ympäristön tehtäväksi. Koska kuvakkeita säilytetään tavallisesti lisäosan hakemistossa, kuvakkeet voi määrittää ja niiden tiedostoja voi hallita yhdessä paikassa.
Muita malleja tulee käyttää vain siinä tapauksessa, että kuvaketta ei voi määrittää laajennuksen lisäyksen osaksi.
Jos kuvaa käytetään harvoin, ja se ei ole yhteiskäytössä, kuvan luonti erikseen on paras käytäntö. Kuva voidaan luoda suoraan SWT:n avulla ja se voidaan poistaa käytön jälkeen.
Kuvia voi myös luoda erikseen käyttämällä ImageDescriptor-luokkaa ja kutsumalla createImage()-metodin. Ensimmäisen esimerkin tapaan kuvan dispose()-metodi (poistometodi) täytyy kutsua, kun kuvaa ei enää tarvita. Jos esimerkiksi valintaikkuna luo kuvan avautuessaan, sen tulee poistaa kuva, kun valintaikkuna suljetaan.
Kun kuvaa käytetään usein lisäosassa, ja kun se on useiden eri käyttöliittymän objektien yhteiskäytössä, on hyödyllistä rekisteröidä kuvan kuvaaja luokan ImageRegistry avulla. Rekisterin kuvat määritetään yhteiskäyttöön kaikille objekteille, jotka suorittavat kuvasta kyselyn samalla nimellä. Rekisteristä ei saa poistaa kuvia, koska ne ovat muiden objektien yhteiskäytössä.
Kuvan lisäys kuvarekisteriin on paras käytäntö, jos kuvaa käytetään toistuvasti, mahdollisesti koko lisäosan voimassaoloajan, ja jos se on useiden objektien yhteiskäytössä. Rekisterin käytön haittapuoli on, että rekisterin kuvat poistetaan vasta, kun graafinen käyttöliittymä suljetaan. Koska yhdellä kertaa auki olevien ympäristön (SWT-) kuvien määrä on rajallinen, lisäosien tulee huolehtia, että ne eivät rekisteröi liikaa kuvia rekisteriin.
Luokassa AbstractUIPlugin on käytäntö lisäosanlaajuisen kuvarekisterin luontiin.
Kun kuvaketta käytetään usein alkioiden näyttämiseen tietyissä katseluohjelmissa, se voidaan määrittää yhteiskäyttöön katseluohjelman samankaltaisten alkioiden kesken käyttämällä otsikon toimittajaa. Koska otsikon toimittaja vastaa kuvan palauttamisesta mille tahansa katseluohjelman objektille, se voi ohjata kuvan luomista ja kuvien yhteiskäyttöön määritystä katseluohjelman objektien kesken.
Otsikon toimittaja voi käyttää mitä tahansa edellä käsitellyistä käytännöistä kuvan tuottamiseen. Selaamalla metodin getImage() toteutuksia LabelProvider-luokan aliluokissa voit tutustua erilaisiin lähestymistapoihin kuten yhden kuvakkeen lataamisen välimuistiin objekteja varten ja lajin mukaan järjestetyn kuvataulukon ylläpitoon. Otsikon toimittajan luomat kuvat täytyy poistaa toimittajan dispose()-metodilla, joka kutsutaan, kun katseluohjelma poistetaan.
Otsikon toimittajien käyttö on hyvä kompromissi kuvien erikseen luonnin ja kuvarekisterin välillä. Se tukee kuvakkeiden yhteiskäyttöä kuvarekisterin lailla, mutta pystyy silti ohjaamaan todellisten kuvien luontia ja poistoa.
Lisäosan hienosäädössä on yleistä kokeilla kaikkia kyseisiä kuvanluontimalleja. Kuvanluontia koskevan päätöksenteon eristäminen omaan luokkaansa voi olla käytännöllistä. Tällöin kaikki asiakkaat ohjataan käyttämään kyseistä luokkaa kuvien poimintaan. Näin kuvien luontikäytäntö voidaan sovittaa vastaamaan lisäosan todellisia toimintaominaisuuksia.
Luokkaa ResourceManager käytetään pitämään yllä ImageDescriptor-luokkien vastaavuuksia Image-luokkiin, jotta Image-luokkaa voidaan käyttää uudelleen viittaamalla siihen sen kuvaajan kautta. Kun kuvaaja pyytää kuvaa rekisteristä, rekisteri palauttaa kuvan, jos se on luotu, tai luo kuvan kuvaajan perusteella. Näin kuvat ovat rekisterin asiakkaiden yhteiskäytössä.
Ylimmän tason ResourceManager-luokka on DeviceResourceManager-luokka, joka luodaan näyttönäkymään. Metodin JFaceResources.getResources() määrittämä ResourceManager-luokka on DeviceResourceManager-lajin luokka, ja sitä voi käyttää ylimmän tason ResourceManager-luokkana. Jos tarvitset ResourceManager-luokan, jolla on lyhyempi elinkaari kuin DeviceResourceManager-luokalla, voit luoda LocalResourceManager-luokan aliobjektina ja poistaa sen, kun et tarvitse sitä enää.
DeviceResourceManager-luokka poistetaan, kun sen luontiin käytetty näyttönäkymä poistetaan, joten erillistä hallintakoodia ei tarvita.
Asiakkaat eivät saa poistaa hallintatoiminnosta (Manager) noudettuja tai sinne lisättyjä kuvia. Hallintatoiminto vastaa kuvan poistosta, koska kuvat ovat useiden asiakkaiden yhteiskäytössä. Rekisteri poistaa kuvat, kun niihin kiinnittynyt ResourceManager-luokka poistetaan.
Myös fontit kuuluvat käyttöjärjestelmien rajallisiin resursseihin. Samat luonti- ja poisto-ongelmat koskevat fontteja kuin kuviakin, ja niihin liittyy samankaltaisia kompromisseja nopeuden ja tilan välillä. Yleensä fontit varaa käyttöön SWT pyytämällä fonttia, jolla on ympäristökohtainen fontin nimi.
Luokka FontRegistry pitää yllä nimen mukaan järjestettyä fonttitaulukkoa. Se ohjaa fonttien varausta käyttöön ja niiden poistoa.
Lisäosien tulee yleensä välttää fonttien kuvausta tai varausta käyttöön ympäristökohtaisin nimin. Vaikka JFace käyttää fonttirekisteriä sisäisesti, lisäosat eivät tavallisesti käytä sitä. Luokkaa JFaceResources tulee käyttää yleisten fonttien käsittelyyn.
On hyvin yleistä sallia käyttäjien määrittää sovelluksen fonttien asetukset asetussivulla. Tällaisissa tapauksissa tulee käyttää luokkaa FontFieldEditor fontin nimen poimintaan käyttäjältä. Luokkaa FontRegistry voidaan käyttää fontin säilytykseen. Luokkaa FontFieldEditor käytetään vain asetussivuilla.
Luokka JFaceResources ohjaa yleisten ympäristöfonttien ja -kuvien käyttöä. Se pitää yllä sisäistä fontti- ja kuvarekisteriä, jotta nimetyt fontit ja kuvat ovat asiakkaiden yhteiskäytössä.
Työympäristössä ja muissa lisäosissa on monia tapoja määrittää kuvia yhteiskäyttöön tarvittaessa. Kuvarekisteri JFaceResources ei ole yleisesti käytössä työympäristön tai lisäosien koodissa.
Fonttien käyttö on huomattavasti yksinkertaisempaa. Työympäristö ja useimmat lisäosat käyttävät JFaceResources-luokkaa pyytämään fontteja loogisen nimen perusteella. Muiden muassa metodit getDialogFont() ja getDefaultFont() on toimitettu, jotta lisäosat voivat käyttää oletettuja fontteja käyttöliittymissään.