CodeGuide

javapic

2013. 01. 14.JavaFx

JavaFX: Első lépések megtétele

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:


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:

  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


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

Creative Commons Licenc

Krámli Erik

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.

  • http://twitter.com/rakoczimrks Rakoczi Markus

    Beveztesnek biztato, orvendek, hogy magyarul van es varom a tovabbi hasznos infokat. Koszi.

    • Krámli Erik

      Köszi, hamarosan érkezik a folytatás!