Többnyelvű JavaFX alkalmazások fejlesztésének támogatása
Az Eclipse IDE-ben lehetőség van egy e(fx)clipse plug-in segítségével JavaFX- es alkalmazások fejlesztésére. A plug-in még egy Incubation projekt, így még vannak hiányosságai. A plug-in-t aktívan használom egy JFX-es projektben és a fejlesztés szempontjából szükséges hiányosságit implementáltam:
- Az FXML fájlok könnyebb, programozottabb elérésére készítettem egy automatikus kódgenerátort, ami a forrásfájlok mentésekor triggerelődik és egy elkülönített src-gen mappába egy Java fájlba (FXMLGenerated.java) legenerálja az FXML fájlok eléréséhez szükséges azonosítókat (URI), amiket a Java forrásfájlokban tudunk használni. A mechanizmus megegyezik az Android platform R.java fájljának generálásával.
- A többnyelvűség támogatása készítettem egy kódgenerátort a UI nyelvi elemeinek dinamikus változtatásához. Az FXML-ben található szöveges elemekhez készítettem egy kódgenerátort, ami egy szöveges konkrét szintaxissal megadott szakterület-specifikus nyelven megalkotott modell alapján legenerálja a szöveges elemek változtatásához szükséges JavaFX Controller osztályokat. A mechanizmust kiegészítettem egy parser-al, ami az FXML fájlok alapján előkészíti a szöveges állományt a többnyelvűség leírására (begyűjti a szükséges UI ID-kat). A szakterület- specifikus nyelvet Xtext-ben készítettem, amit egyszerűen tudtam validálni és abból Xtend-el kódot generálni szintén az elkülönített src-gen mappába.
Megvalósítás
A feladat megvalósításához az Eclipse-es Xtext nyelvtervező keretrendszert használtam. Ezzel egyszerűen fel tudtam építeni a szakterület- specifikus nyelvet, melyet *.ml kiterjesztésű fájlokban lehet megadni. Ehhez írtam Validátor-t, ami a szöveges fájl helyességét tudja ellenőrizni és a felhasználónak visszajelezni. Írtam Formatter-t és SyntaxHighlightProvider-t, amik a könnyebb átláthatóságot és strukturáltságot segítik. A Controller és *.ml (MultiLanguage) fájlok generálása kontextus menüből történik, míg az FXMLGenerated.java fájl generálása automatikus, erre egy külön Builder-t regisztráltam be.
Felhasználás
A készített plug-in értelmes használata Java 8-as – Java FX-es fejlesztések során jöhet elő az e(fx)clipse plug-in funkcionalitását kiegészítve. Így JDK 8 és az e(fx)clipse plug-in szükségesek a helyes működéséhez. A plug-in fejlesztésekor az e(fx)clipse projekt 0.9-es verziója volt elérhető.
A plug-in tartalmaz egy Java FX Support környezetet (Nature), amit be kell regisztrálni az egyes projektekhez, hogy használni tudjuk a plug-in funkcionalitását. Ezt a projektre kattintva egy kontextus menüben tehetjük meg a Configure JavaFX gombbal. (A plug-in környezetének eltávolításához is ezt a gombot kell használni).
A plug-in és környezetének beregisztrálása után már használhatjuk az eszközt. A környezet beregisztrálásával egy FXML Builder is beregisztrálódik, ami az FXMLGenerated.java fájlt generálja. Az FXML Builder automatikusan fut a projekt forrásfájljainak mentésekor. Ekkor a Builder összeszedi a projekt src mappájában lévő *.fxml fájlokat és legenerálja hozzájuk az FXMLGenerated.java fájlt, ami tartalmazza a *.fxml fájlok elérésének útvonalát. Így ezek elérése gyors és könnyű, mivel ezeket az URI-kat nem kell kézzel előállítani.
A plug-in másik funkciójának használatához (többnyelvűséget támogató Controller generálása) szükség van egy szöveges konfigurációs fájlra (configuration.conf) a projekt gyökérmappájában. Ebben meg kell adni a támogatni kívánt nyelvek nevét (languages), opcionálisan megadható, hogy az *.fxml file-ok parse-olása esetén milyen típusú tag-ek kerüljenek generálásra (support) és opcionálisan megadható a generált Controller-nek egy ősosztály (superclass). A konfigurációs fájl tartalmát szintén egy szakterület-specifikus nyelven lehet megadni. Így a konfiguráció helyessége még a parser és a kódgenerátor futtatása előtt ellenőrzött. Ha hiba van a konfigurációs fájlban az Eclipse jelzi és a kódgenerátor ez esetben el sem indul.
A Controller generáló résznek több fázisa van. Először is meg kell keresnünk a *.fxml fájlt, amihez a Controller-t akarjuk generálni. Majd jobb klikk és kontextus menü segítségével ki kell választani a Parse FXML opciót, ekkor az *.fxml fájlt a plug-in parse-olja és egy felugró dialógusablakban megtekinthetők a parse-olt ID-k és tag-ek nevei. A parse-olás figyelembe veszi a konfigurációs fájlban megadott támogatott tag-eket. Ha nincs ilyen megadva, akkor minden fx:id attribútummal rendelkező vezérlő bekerül a listába, különben csak a megadott tag-ekkel rendelkezők. Az OK gombra kattintva az src-gen mappába a megfelelő package struktúrába legenerálódik egy hasonló nevű *.ml kiterjesztésű fájl, ami a szöveges több nyelvűséget leíró szakterület-specifikus modellt tartalmazó fájl.
A generált *.ml fájl tehát tartalmaz egy előkészített modellt a többnyelvűség támogatásának generálásához. Tartalmazza a konfigurációs fájlban megadott célnyelveket, a beállítandó UI elemek fx:id-jait és az esetben, ha már az adott fx:id-jú elemhez tartozott valamilyen szöveg az FXML-ben (text attribútum), ezt a szöveget a generátor elhelyezi az adott elem első nyelvének értékéhez. Így abban az esetben, ha már az egyik nyelv rendelkezésre áll az FXML-ben, azt nem kell újra bevinni az *.ml fájlba.
Ezek után a generált *.ml fájlokat szerkeszthetjük, melyet a Validator ellenőriz, például, hogy megfelelő számú oszlop van-e a sorokban vagy, hogy nem használunk-e az id-kban Java nyelvi elemeket, stb. Az *.ml fájl szerkesztése után a fájlra jobb gombbal kattintva a Generate Controller opciót választva az src-gen mappába legenerálódik az adott Controller. A Controller-ek mellé legenerálódik egy ApplicationSettings osztály, egy Language enumeration és egy ControllerInterface interface. Ezek szükségesek a generált Controller-ek és a nyelvi támogatás működéséhez.
A generált Controller használatához le kell származnunk belőle (tilos módosítani a generált fájlt) és onnan használni a generált függvényeket és tagváltozókat.