Ebben a cikksorozatban a JavaFX platform kerül bemutatásra. Minden részben egy fontosabb dolgot fogunk tárgyalni. Elsősorban a nyelv bemutatása, annak megismertetése a cél példákon keresztül, de a fejlesztést segítő eszközök használatáról is lesz szó.
Miért pont JavaFX?
Elsősorban azért választottam ezt a platformot, mert új és sokkal kifinomultabb alkalmazásokat lehet vele létrehozni. Ráadásul az AWT-, és Swing-komponensek már több éve elavultnak számítanak. A JavaFX-ben fejlesztett alkalmazások Java alapúak és web-technológiákat használnak, mégis a hagyományos asztali programokhoz hasonló funkcionalitással és képességekkel bírnak (RIA – Rich Internet Application). A platform további előnyei: Java API támogatás, lehetőség xml-alapú felhasználói felület megalkotására, grafikus csővezeték a GPU-hoz, rengeteg vezérlő elem, webes tartalmak beágyazhatósága.
Előkészületek
A fejlesztéshez szükségünk van a megfelelő SDK-ra. Szerencsére a Java JDK7-ben már benne van a JavaFX 2.2 támogatás, így nem kell ezzel külön foglalkoznunk. Ha mégis hiányozna, akkor töltsük le az Oracle oldaláról.

JDK 7-es verzió letöltése az oracle.com oldalról
A kódoláshoz tetszőleges integrált fejlesztői környezet (IDE) használható, amely támogatja a Java nyelvet, továbbá a JavaFX-et. Ilyen például a Netbeans, az Eclipse, vagy a JDeveloper. Ezen programok legfrissebb verzióiban már benne van a JavaFX támogatás, ellenkező esetben a megfelelő plugin, vagy frissítés telepítése megoldja a problémát.
Az első alkalmazásunk
A programunknak nem lesz különösebb funkciója, inkább a platform struktúrájának megértésére helyezzük a hangsúlyt. Netbeansben a következőféleképpen tudunk létrehozni egy JavaFX alkalmazást:
- File -> New Project…
- A ‘JavaFX’ kategórián belül válasszuk a ‘JavaFX Application’ pontot -> Next
- Nevezzük el a projektet: FirstJavaFxApplication -> Finish
Ekkor a Netbeans létrehozza a projektet, megnyitja a FirstJavaFxApplication.java nevű fájlt, melynek tartalma az alábbi kód lesz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 package mypackage;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class FirstJavaFxApplication extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
A platform stuktúrájának fontosabb elemei
Ebben a szekcióban a fentebb látható kód egyes részeit fogjuk külön-külön elemezni. Kezdjük is el!
A főosztály
1
2
3
4
5
6
7
8
9
10 public class FirstJavaFxApplication extends Application {
@Override
public void start(Stage primaryStage) {
// important part here ...
}
public static void main(String[] args) {
launch(args);
}
}
A főosztály a javafx.application.Application osztály kiterjesztése. Ennek az Application osztálynak az életciklusa a következő elemekből áll, melyek sorban egymás után hívódnak meg:
- Létrejön az osztály egy példánya.
- Meghívódik az init() metódus.
- Meghívódik a start(javafx.stage.Stage) metódus.
- Várakozás a befejezésre, ami pontosan akkor következik be, ha egy Platform.exit() hívás történik, vagy az alkalmazás összes ablaka bezárásra került.
- Meghívódik a stop() metódus.
Az init(), és stop() függvényeknek van konkrét implementációjuk, amelyek nem csinálnak semmit. A start() metódus absztrakt, és minden esetben felül kell definiálni. Ez a fő belépési pontja minden JavaFX alkalmazásnak, melyet általában a main()-ből indítanak a launch() hívással. A launch() csak egyszer hívható, ellenkező esetben kivétel fog keletkezni.
Színpad és színtér
1
2
3
4
5
6 @Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
}
A felhasználói interfész kezeléséhez definiálva van egy ún. színpad (Stage) és egy színtér (Scene). Az alkalmazáshoz tartozó elsődleges színpadot (primaryStage) a platform konstruálja, de lehet több is belőle. A Stage osztály a legfelső szintű konténer, a Scene oszály pedig minden egyéb tartalom konténere. A példában létrejön egy színpad és egy színtér, melyet láthatóvá teszünk a megadott pixel méretben.
A JavaFX a színtér tartalmát egy hierarchikus színtér-gráfban csúcsokkal reprezentálja. Minden esetben definiálnunk kell egy gyökér csúcsot. A mi esetünkben ez a StackPane objektum (root) volt, ami méretezhető és az elrendezéskezelésért felelős. Ez azt jelenti, hogy a gyökér csúcs mérete követi a színtér méretének változásait.
Építőelemek
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 @Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
}
A javafx.scene.control csomagban találhatjuk a grafikus felhasználói felület építőelemeit. Az alkalmazásunkban egy egyszerű nyomógombot használtunk, melyhez egy egyszerű eseménykezelő tartozott. Az esemény bekövetkezésekor (gombnyomás) a “Hello World!” üzenet íródik ki a standard outputra. Fontos, hogy a színtérhez hozzá kell rendelni a komponenseket! Tehát a mi esetünkben a gombot (btn) kellett hozzáadni a konténerhez (root).
A megjelenítés
1
2
3
4
5
6
7
8
9
10 @Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
A start() metódus végén beállítottuk az ablak címét a primaryStage.setTitle(), majd magát a megjelenítendő
színteret a primaryStage.setScene(scene). A tényleges megjelenésért a primaryStage.show() metódus felelős,
ennek megléte kötelező!






