JavaFX-kirjasto

JavaFX on ilmainen kirjasto graafisten käyttöliittymien toteuttamiseen Javalla.

JavaFX kehitettiin Javan vanhentuneiden AWT- ja Swing-kirjastojen korvaajaksi ja se olikin jonkin aikaa osa Java JDK:ta. JavaFX kuitenkin ulkoistettiin Oraclen toimesta avoimen lähdekoodin OpenJFX-projektiksi Javan 11. version yhteydessä.

Oraclen JavaFX-tutoriaali on edelleen hyödyllinen resurssi JavaFX-ohjelmia toteuttaessa. OpenJFX-projektin dokumentaatiosta löytyy muun muassa ohjeita JavaFX:n käyttöön eri ohjelmointityövälineiden kanssa.

Vaikka JavaFX on saatavilla erillisenä kirjastona, on helpointa käyttää projektinhallintajärjestelmää ja IDE:ä. Tällä kurssilla toimitaan juuri näin: NetBeansilla luodaan Maven-projekti, jonka pom.xml-tiedostoon NetBeans lisää automaattisesti tarvittavat määrittelyt JavaFX-riippuvuuksille ja -liitännäisille.

Kurssin materiaalissa NetBeansin JavaFX-projektit ovat pääosin moduulittomia ja tehdään yleensä “yksinkertaisiksi” JavaFX-projekteiksi eli projekteiksi, joissa ei käytetä FXML-merkintäkieltä. NetBeansissa JavaFX-ohjelman saa toteutettua tällaisena projektina valitsemalla New Project | Simple JavaFX Maven Archetype.

Yksinkertaisen JavaFX-projektin luominen NetBeansissa.

Yksinkertaisen JavaFX-projektin luominen NetBeansissa.

Päivitä NetBeansissa näin projektia luodessasi Additional creation properties -kohdassa javafx-version-kentälle arvo 17.0.1 ja javafx-maven-plugin-version-kentälle arvo 0.0.8, joita tehtävien automaattitarkistaja käyttää. Versionumerot voivat olla uudempia, jos tehtävässä ei ole automaattitarkistusta. Käytä edellä mainittuja versioita myös, jos toteutat JavaFX-tehtävät jollain muulla IDE:llä tai täysin ilman IDE:ä.

JavaFX-projektin pom.xml:ssä on riippuvuus JavaFX:lle. Esimerkiksi:

<dependencies>
   <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>17.0.1</version>
  </dependency>
</dependencies>

Tämä riippuvuus riittää yksinkertaisissa projekteissa, koska Maven osaa päätellä itse kaikki muut tarvittavat JavaFX-riippuvuudet.

Lisäksi pom.xml:ssä on määrittely JavaFX-Maven-liitännäiselle. Esimerkiksi:

<plugins>
    <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>0.0.8</version>
        <configuration>
            <mainClass>package.MainClass</mainClass>
        </configuration>
    </plugin>
</plugins>

missä package.MainClass on JavaFX-ohjelman määrittelevä luokka pakkausmääreineen. Esimerkiksi alempana annetun JavaFX-esimerkin projektitiedostossa mainClass-elementillä tulisi olla arvo example.App.

Huomaa, että NetBeans luo nbactions.xml-tiedoston, jossa on tarvittavat määrittelyt JavaFX-projektin ajamiseen ja debuggaamiseen NetBeansissa. Ohjelmoijan ei yleensä tarvitse huolehtia tästä tiedostosta millään tavalla.

NetBeansilla tai muuden luodun Maven-hallitun JavaFX-projektin voi ajaa komentoriviltä komennolla mvn javafx:run.

Vaikka NetBeans populoi alustavan luokan valmiiksikin, alla on annettu itsekirjoitettuna lähes yksinkertaisin mahdollinen JavaFX-ohjelma:

package example;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


/**
* JavaFX App
*/
public class App extends Application {

    @Override
    public void start(Stage stage) {
        // Setting the main window with a title
        stage.setTitle("All the world's a stage");
        // Show the main window
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

Lähdetään purkamaan ohjelman rakennetta ja katsotaan, mistä JavaFX-ohjelma oikeastaan koostuu. JavaFX-ohjelman pääluokka erikoistaa javafx.application.Application-luokkaa. Kun ohjelma käynnistyy, ohjelman suoritus etenee pääluokan tasolla seuraavasti:

  1. Application-luokasta periytyvästä App-luokasta luodaan olio.

  2. Kutsutaan automaattisesti olion init()-metodia, jonka tehtävä on alustaa ohjelman tarvitsema tila ennen suorituksen alkua, esimerkiksi luoda tarvittavia olioita.

  3. Kutsutaan automaattisesti olion start(Stage stage)-metodia, joka toimii ohjelman alkupisteenä. Tälle metodille IDE antaa yleensä oletustoteutuksen, jota ohjelmoijan tulee sitten muokata tehtävään sopivaksi. Metodi saa parametrinaan javafx.stage.Stage-olion, joka määrittelee ohjelman pääikkunan. Show()-metodin kutsuminen stage:lle näyttää ikkunan ruudulla.

  4. Ohjelma jää kuuntelemaan tapahtumia. Pääluokka odottaa tässä kohtaa ohjelman sulkevaa tapahtumaa eli joko Platform.exit():n kutsua tai sitä, että kaikki ohjelman ikkunat on suljettu ja Platform:lle on määritelty implicitExit.

  5. Kutsutaan automaattisesti olion stop()-metodia.

On tärkeää huomioida, että start() on Application:ssa abstrakti ja se on siten toteutettava Application-luokasta perittävässä omassa JavaFX-sovellksessa. Init()- ja stop()-metodeille on tarjolla tyhjät toteutukset.

Ohjelmamme ei vielä tee mitään. Lähdetään siis lisäämään toiminnallisuutta ikkunaan.

JavaFX-ohjemassa