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.

JavaFX letöltése

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:

  1. File -> New Project…
  2. A ‘JavaFX’ kategórián belül válasszuk a ‘JavaFX Application’ pontot -> Next
  3. 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:

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

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:

  1. Létrejön az osztály egy példánya.
  2. Meghívódik az init() metódus.
  3. Meghívódik a start(javafx.stage.Stage) metódus.
  4. 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.
  5. 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

@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

@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

@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ő!

A sorozat további részei

Cimkék:

Az Eötvös Loránd Tudományegyetem Informatikai Karának hallgatója vagyok. Jelenleg az Információs Rendszerek tanszék Tudáskezelő laborjában dolgozom.