Languages

Erudis - your road to knowledge
Zarządzanie zasobami

Kolejnym elementem, który daje nam SAF jest ustandaryzowane zarządzanie zasobami. Dotyczy to w zasadzie wszystkich składników aplikacji, które nie są kodem Java: napisów na etykietach, przyciskach, itp., ikon, używanych czcionek, kolorów. W jaki sposób to się odbywa?

Zasoby dzielą się na globalne i lokalne. Załóżmy, że główną klasą naszej aplikacji jest GlownaKlasaAplikacji. Zasoby globalne są umieszczone wtedy w pliku GlownaKlasaAplikacji.properties, który musi się znajdować w pakiecie nazwa.pakietu.resources, przy założeniu, że klasa GlownaKlasaAplikacji znajduje się w pakiecie nazwa.pakietu. W naszym przypadku zasoby globalne dla języka polskiego znajdziemy w pliku MainApp.properties, a dla języka angielskiego w MainApp_en_US.properties. Oba pliki są w pakiecie pl.xoft.saf.finder.ui.resources.

Zasoby lokalne są przechowywane zgodnie z tę samą konwencją co powyżej – każda klasa ma swój plik z zasobami umieszczony w pliku properties o nazwie takiej samej jak nazwa klasy. Do zasobów dostajemy się tak, jak to demonstruje listing klasy MainApp (Listing 1).

W metodzie initialize(String[]) tworzymy uchwyt do bardzo użytecznej klasy, ApplicationContext, reprezentującej środowisko (kontekst) działania aplikacji. Następnie z kontekstu aplikacji wyciągamy klasę zarządzającą zasobami: ResourceManager. W klasie MainApp zasobów używamy przy tworzeniu okna dialogowego, które pojawia się, gdy ktoś chce zamknąć aplikację.

Bardzo użyteczną cechą SAF jest automatyczna konwersja niektórych zasobów na klasy Java. Przeanalizujmy pokazany na Listingu 2 fragment klasy MainFrame.

Interesuje nas element menu pozwalający zwiększyć lub zmniejszyć wielkość czcionki.

Listing 2. Demonstracja automatycznej konwersji definicji zasobów, czyli łańcuchów znaków, na klasy języka Java

66. jMenuItem3.setAction(actionMap.get("makeLarger"));  
67. jMenuItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 
        InputEvent.ALT_MASK | InputEvent.CTRL_MASK));  
68. jMenuItem3.setIcon(resourceMap.getIcon("jMenuItem3.icon"));  
69. jMenuItem3.setText(resourceMap.getString("jMenuItem3.text"));  
70. jMenuItem3.setName("jMenuItem3");  
71. jMenu2.add(jMenuItem3);

Aby menu było czytelniejsze jest tam umieszczona odpowiednia ikona (Rysunek 3). Bez SAF sami byśmy musieli z łańcucha znaków, reprezentującego konkretny zasób, wyprodukować obiekt klasy ImageIcon, a tutaj wystarczy, że użyjemy metody ResourceMap.getIcon(String). Podobnie konwertowane są z łańcuchów znaków definicje czcionek i kolory. Niby drobne udogodnienie, ale jeśli dołożymy do tego internacjonalizację i pomnożymy wszystko przez, powiedzmy, 500 wystąpień w dużej aplikacji, to okaże się, że jednak trochę rękę i klawiaturę oszczędziliśmy.

Szukacz - zwiększanie/zmniejszanie czcionki

Rysunek 3. Fragment menu aplikacji Szukacz, pozwalający zmieniać wielkość czcionki.