Errata do książki “JavaFX. Tworzenie graficznych interfejsów użytkownika”

W rozdziale 30 książki wkradł się drobny błąd w pliku Listing30_08, spowodowany usunięciem biblioteki SWT z JavaFX. Opcja SWT pozostała jednak w wyliczeniu ConditionalFeature. Klasa powinna wygladać następujaco:

package rozdzial30;

import javafx.application.Application;
import javafx.application.ConditionalFeature;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Listing30_08 extends Application {

    public static void main(String[] args) {

        Application.launch(args);
    }

    @Override
    public void start(Stage stage) {
        try {
            ConditionalFeature[] cfs = ConditionalFeature.values();
            for (ConditionalFeature cf : cfs) {
                if(cf.name()!="SWT") {
                    System.out.println(cf.name() + ": "
                            + Platform.isSupported(cf));
                }
            }
            StackPane root = new StackPane();
            Scene scene = new Scene(root, 300, 200);
            stage.setScene(scene);
            stage.setTitle(this.getClass().getName());
            stage.setOnCloseRequest(e -> Platform.exit());
            stage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

Aktualność książki “JavaFX 9. Tworzenie graficznych interfejsów użytkownika”

Tekst książki jest aktualny na dziś, czyli 17 kwietnia 2021, przy uwzględnieniu uwag z poniższego artykułu.

Od czasu wydania mojej i taty książki, o której pisałam w artykule Kulisy powstania książki “JavaFX 9. Tworzenie graficznych interfejsów użytkownika”, pojawiły się kolejne wersje Javy i JavaFX troszkę się zmieniła (o tych zmianach możesz przeczytać w tekście Zmiany w JavaFX od JavaFX 9). Mimo to książka jest nadal aktualna, a ponieważ chcemy, żebyście mogli z niej swobodnie i wygodnie korzystać, wykorzystując najnowszą wersję JDK, w tym artykule opisujemy zmiany i udostępniamy zaktualizowane kody.

Zmiany w rozdziale 30 – Nashorn

“Rozdział 30. Nashorn”, poświęcony wersji JavaScript “Nashorn”, przeznaczonej dla JDK, stracił rację bytu w dniu 15 września 2020, wraz z pojawieniem się JDK 15, z którego Nashorn został ostatecznie usunięty. Z czasem jednak pojawiły się zmodularyzowane biblioteki Nashorn 15.3, których można używać poprzez Maven albo niezależnie od niego.

Biblioteka Nashorn 15.3

Tutaj znajdziesz plik IdeaIntellij z aktualnymi kodami dotyczącymi Nashorna i FXML, a tutaj potrzebne pliki JAR. Projekt zawiera kody do rozdziału 30 i komplet kodów do rozdziału 34, w tym również te przykłady, które nie wymagają użycia biblioteki Nashorn. Konieczne jest stworzenie biblioteki nashorn, którą można utworzyć z załączonych plików JAR, wymagane jest też JDK oraz JavaFX – najlepiej w wersji 17.0.1.

Zmiany w rozdziale 34 – FXML

W tym rozdziale pojawia się kilka przykładów, pokazujących obsługę przycisków przy użyciu JavaScript Nashorn. W związku z usunięciem Nashorna, przykłady te od wersji JDK 15 przestały działać. Ponieważ jednak obecnie ponownie można używać Nashorna, można również używać FXML.

Zmiany w rozdziale 36 – modularyzacja

“Rozdział 36. Modularyzacja” tylko pośrednio dotyczy JavaFX. Kiedy pisaliśmy książkę, było to zagadnienie nowe, wymagające dokładniejszego omówienia. Dzisiaj wszyscy ten temat znają, a w Internecie jest mnóstwo dobrych materiałów przybliżających związane z nim problemy. Dlatego gdybyśmy wydawali nową wersję książki, ten rozdział zostałby prawdopodobnie usunięty. Mimo to wszystko, co w nim powiedziano, jest nadal aktualne.

Zmiany w kodzie

Kod projektu został przejrzany, sprawdzony i zweryfikowany zgodnie z powyższymi uwagami. Zmiany w kodzie w stosunku do wersji pierwotnej są następujące:

  • Ścieżki do plików obrazków, które zaczynały się od ‘src/’, teraz zaczynają się od ‘JavaFX9/src/’ ze względu na zmiany w układzie modułów.
  • Usunięto Rozdział 30. “Nashorn” ze względu na usunięcie tego języka z JDK.
  • W przypadku urli ścieżka zmienia się z:
    URL url = this.getClass().getClassLoader().getResource("JavaFX9/src/resources/html/alert.html");
    na:
    URL url = this.getClass().getResource("/resources/html/alert.html");
  • Z powodu usunięcia języka Nashorn usunięto pliki:
    • Listing34_05.java oraz /resources/listing34_05.fxml
    • Listing34_06.java oraz /resources/listing34_06.fxml
    • Listing34_07.java oraz /resources/listing34_07.fxml
    • Listing34_08.java oraz /resources/listing34_08.fxml
    • Listing34_12.java oraz /resources/listing34_12.fxml
  • Folder ‘math’ dołączono do projektu jako moduł.
  • W module ‘math’ dodano brakujący folder ‘assets’
  • Pominięto projekty od Rozdzial36_1 do Rozdzial36_6. Nie wymagają one poprawek i można je ściągnąć ze strony Helionu.

Nowy kod

Poprawiony i zaktualizowany kod w postaci projektu IntelliJ IDEA możecie ściągnąć stąd:

UWAGA!
Jeżeli korzystacie z Google Chrome, przy pobieraniu mogą się pojawić ostrzeżenia o treści: “Plik JavaFX9.zip jest rzadko (albo: nie jest często) pobierany i może być niebezpieczny”. Możecie je zignorować – w plikach nie ma nic niebezpiecznego, a ostrzeżenie pojawia się ze względu na to, że zip zawiera pliki *.iml, charakterystyczne dla projektów IntelliJ IDEA, które są rzadko przesyłane.

Jeżeli w IntelliJ Idea będzie środowisko o nazwie “15” (czyli Open JDK 15.0.2) oraz biblioteka globalna o nazwie “javafx” (JavaFX 15.0.1), nie będziecie mieć problemu z importem projektu.

Do projektu trzeba dodać (tak jak się dodaje bibliotekę) dwa pliki *.jar obecne w folderze src/resources/jars.

W pliku do ściągnięcia nie umieszczano materiałów dotyczących rozdziału 36. Nie wymagały one żadnej zmiany i właściwie są już mało użyteczne, choć wciąż aktualne. Jeśli potrzebujesz – możesz użyć kodów dostępnych na stronie książki w Wydawnictwie Helion.

Nasza książka o JavaFX

Nasza książka o JavaFX już dostępna na stronie Helionu. Bardzo ją Wam polecam. Mimo że dotyczy Javy 9, jest kompatybilna z najnowszą wersją JavaFX, z uwzględnieniem zmian, o których czytaliście w powyższym tekście. Jest napisana przystępnym językiem, tłumaczy zagadnienia w prosty, jasny sposób i pozwala szybko nauczyć się korzystania z funkcjonalności JavaFX. Można ją traktować jako podręcznik, czytając krok po kroku, ale też nic nie stoi na przeszkodzie, by korzystać z niej, szukając konkretnych zagadnień.

Oprócz książki Helion udostępnia też pliki z kodami źródłowymi. Warto je pobrać, bardzo się przy nich napracowaliśmy, ale w efekcie powstał kod, który ułatwia zrozumienie treści znajdujących się w książce. Wszystkie kody można uruchomić i zobaczyć w praktyce, jak działają poszczególne elementy JavaFX. Pliki znajdują się tutaj:

W sprzedaży jest już też dostępna nowa, zaktualizowana wersja książki, zgodna z wersją JavaFX 17:

Kody do nowej książki znajdziecie tutaj:

A jeśli chcielibyście ściągnąć sobie pełny projekt IntelliJ IDEA z kodami przykładów, to jest dostępny tutaj:

Kod w Kotlinie można ściągnąć stąd:

Jeśli chciałbyś wiedzieć, jak zamienić kod JavaFX na Kotlina, to instrukcja znajduje się w tym artykule.

Zmiany w JavaFX od JavaFX 9

Od czasu wydania mojej i taty książki, o której pisałam w artykule Kulisy powstania książki “JavaFX 9. Tworzenie graficznych interfejsów użytkownika”, pojawiły się kolejne wersje Javy i JavaFX troszkę się zmieniła. Nie są to duże zmiany, ale warto o nich wspomnieć.

Zmiany w JavaFX 10

W JavaFX 10 nie było żadnych zmian w stosunku do Java 9. JavaFX została jedynie przeniesiona z Oracle do OpenJFX.

Zmiany w JavaFX 11

JavaFX 11 stała się zestawem modułów oddzielonych od JDK 11, wymaga jednak obecności przynajmniej OpenJDK 10, a najlepiej JDK 11, które jest rekomendowane.

Od tej wersji autonomiczne (standalone) moduły javafx.* są ładowane przez ładowarkę klas aplikacji i domyślnie nie wymagają zezwoleń (permissions). Aplikacje, które mają być uruchamiane z menedżerem bezpieczeństwa muszą specyfikować plik polityki bezpieczeństwa używając “-Djava.security.policy”, a także udzielając pozwolenia na każdy moduł javafx.*.

Więcej informacji na ten temat znajdziesz na stronie JDK-8210617.

W tej wersji naprawiono też niektóre błędy i wprowadzono szereg rozszerzeń, ich listę znajdziesz tu: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 11.

Najważniejszą zmianą jest dodanie FX Robot API z klasą javax.scene.robot. Robot w module javafx.graphics.

Zmiany w JavaFX 12

W wersji JavaFX 12 brak przełomowych zmian. Listę rozszerzeń i naprawionych błędów znajdziesz tutaj: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 12.

Warte zauważenia jest dodanie obsługi File API oraz FileReader w WebView.

Zmiany w JavaFX 13

Ta wersja nie wnosi nic szczególnie istotnego. Lista rozszerzeń i naprawionych błędów znajduje się tu: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 13.

Zmiany w JavaFX 14

W wersji JavaFX 14 nadal brak przełomowych zmian. Listę rozszerzeń i naprawionych błędów znajdziecie tutaj: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 14.

Warte zauważenia jest wprowadzenie obsługi HTTP/2 do WebView.

Zmiany w JavaFX 15

Również i w tej wersji nie pojawiło się nic szczególnie istotnego. Listę rozszerzeń i naprawionych błędów dla JavaFX 15 znajdziecie tu: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 15, a dla JavaFX 15.0.1 tu: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 15.0.1.

Zmiany w JavaFX 16

Listę rozszerzeń i naprawionych błędów dla JavaDX 16 znajdziecie tutaj: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 16.

W tej wersji pojawia się dość istotna zmiana: od teraz JavaFX musi być załadowana z modułów umieszczonych na ścieżce modułów (MODULEPATH). Nie może być ładowana ze ścieżki klas (CLASSPATH).

Oprócz tych zmian w JavaFX 16 pojawił się też odkryty przez nas błąd. Do wykonania kodu tworzenia migawek zawierajacych linię
BufferedImage bi = SwingFXUtils.fromFXImage(wi, null);
wymagane są moduły java.desktop i javafx.swing. Niestety, ‘module-info.java’ wyrzuca komunikat pokazany na obrazku poniżej:

Komunikat: Module 'rozdzial07c' reads package 'java.applet' from both 'java.desktop' and 'java.desktop'

Usunięcie linii dotyczącej ‘java.desktop’ niczego nie zmienia, ale kod mimo wszystko się wykonuje. Prawdopodobną przyczyną komunikatu jest błąd w module ‘javafx.swing’. Problem występuje tylko w JavaFX 16, we wcześniejszych wersjach JavaFX się nie pojawia.

Zmiany w JavaFX 17

W tej wersji nie pojawiło się nic istotnego. Pełną listę zmian znajdziecie tutaj: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 17. Natomiast listę zmian dla wersji 17.0.0.1 i 17.0.1 można zobaczyć tu: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 17.0.0.1 i 17.0.1.

Zmiany w JavaFX 18

W tej wersji brak istotnych zmian. Pełną listę nowości znajdziecie tutaj: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 18.

Zmiany w JavaFX 19

Nie ma istotnych zmian w tej wersji. Pełną listę nowości znajdziecie tutaj: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 19.

Zmiany w JavaFX 20

W JavaFX 20 weszły w życie dwie ważne zmiany:

1) JavaFX 20 wymaga obecności JDK 17+.

2) W FXML silnik JavaScript jest domyślnie ustawiony na disabled. Aby użyć kodu JavaScript w FXML, oprócz dodania odpowiedniej biblioteki, należy ustawić zmienną systemową -Djavafx.allowjs=true. Najlepiej zmienną ustawić na true w metodzie init, a na false w metodzie stop.

Inne języki skryptowe nie wymagają żadnych zmian. Pełną listę nowości znajdziecie tutaj: lista naprawionych błędów oraz lista rozszerzeń dla JavaFX 20.

Nasza książka o JavaFX

Nasza książka o JavaFX już dostępna na stronie Helionu. Bardzo ją Wam polecam. Mimo że dotyczy Javy 9, jest kompatybilna z najnowszą wersją JavaFX, z uwzględnieniem zmian, o których czytaliście w powyższym tekście – ich realizację znajdziecie w artykule Aktualność książki “JavaFX 9. Tworzenie graficznych interfejsów użytkownika”. Książka jest napisana przystępnym językiem, tłumaczy zagadnienia w prosty, jasny sposób i pozwala szybko nauczyć się korzystania z funkcjonalności JavaFX. Można ją traktować jako podręcznik, czytając krok po kroku, ale też nic nie stoi na przeszkodzie, by korzystać z niej, szukając konkretnych zagadnień.

Oprócz książki Helion udostępnia też pliki z kodami źródłowymi. Warto je pobrać, bardzo się przy nich napracowaliśmy, ale w efekcie powstał kod, który ułatwia zrozumienie treści znajdujących się w książce. Wszystkie kody można uruchomić i zobaczyć w praktyce, jak działają poszczególne elementy JavaFX. Pliki znajdują się tutaj:

W sprzedaży jest już też dostępna nowa, zaktualizowana wersja książki, zgodna z wersją JavaFX 17:

Kody do nowej książki znajdziecie tutaj:

A jeśli chcielibyście ściągnąć sobie pełny projekt IntelliJ IDEA z kodami przykładów, to jest dostępny tutaj:

Kod w Kotlinie można ściągnąć stąd:

Jeśli chciałbyś wiedzieć, jak zamienić kod JavaFX na Kotlina, to instrukcja znajduje się w tym artykule.

Kulisy powstania książki “JavaFX 9. Tworzenie graficznych interfejsów użytkownika”

Wydawnictwo Helion właśnie wydało kolejną książkę. Żadna niespodzianka, prawda? Książka nosi tytuł “JavaFX 9. Tworzenie graficznych interfejsów użytkownika”. Też mało zaskakujący, jeśli zna się profil wydawnictwa. Co więc jest w tej książce niezwykłego? To znaczy oprócz tego, że jest świetna i pozwala w łatwy sposób nauczyć się programować? W sumie nic… poza tym, że jest mojego i mojego taty autorstwa 🙂 .

Pracowaliśmy nad nią przez wiele pełnych wyrzeczeń miesięcy. I oto wreszcie jest! I można ją zamówić w przedsprzedaży na tej stronie. Można też przeczytać darmowy fragment książki, żeby się przekonać, czy faktycznie jest dla Was interesująca.

Jak to się zaczęło

Pomysł książki narodził się bardzo dawno temu, chyba jeszcze w 2015 roku, w głowie mojego taty. Długi czas sobie tam siedział, powoli moszcząc się i urządzając, wypływał od czasu do czasu w rozmowach, ale nie spieszyło mu się. Aż wreszcie, mniej więcej na wiosnę 2017 roku, dojrzał. Książka zaczęła powstawać, początkowo jedynie jako zestaw kodów autorstwa taty. Wtedy wydawało nam się, że to właśnie jest najgorsza część roboty. Tata napisał kody i krótkie, ogólne ich opisy, zarysy zagadnień, które miały zostać poruszone. Jest tego dużo, jak możecie się przekonać, więc prace trochę trwały. Zaplanował też strukturę książki, choć potem trochę ją jeszcze zmienialiśmy.

Wreszcie, mniej więcej w połowie kwietnia 2017 roku, surowe teksty i kody trafiły do mnie. Jednocześnie skontaktowaliśmy się z wydawnictwem Helion, proponując im wydanie naszej książki. Odzew był bardzo szybki i pozytywny – piszcie! Wydawnictwo chciało wiedzieć, kiedy książka będzie gotowa. Przewidywałam, że zajmie to sporo czasu – trzeba było jeszcze napisać większość tekstu, a także sformatować go zgodnie z wymogami wydawnictwa, poza tym wiedzieliśmy już, że na jesieni wyjdzie Java 9 i będzie trzeba poprawić i uzupełnić kody (pierwowzór książki powstał jeszcze w Javie 8), więc podałam jako termin koniec 2017 roku. Wydawało mi się, że to duży zapas czasowy. Jakże się myliłam!

Swoją część pracy rozpoczęłam mniej więcej w tym samym czasie, w którym skontaktowaliśmy się z wydawnictwem. Początkowo nie przykładałam się bardzo, bo wydawało mi się, że jest dużo czasu, poza tym była piękna pogoda, więc uznałam, że intensywniej wezmę się za to na jesieni.

Wyścig z czasem

Na jesieni okazało się, że czasu jest za mało! Rozpoczął się wyścig z czasem. Wymienialiśmy z tatą od kilkunastu do kilkudziesięciu połączeń dziennie. Roboty był ogrom. Musiałam zrozumieć napisane kody, czasem je przerobić lub zarządzić ich przerobienie. Ale przede wszystkim napisać i uporządkować tekst – tak, żeby był czytelny i zrozumiały, żeby nie mający doświadczenia czytelnik wiedział, jak i po co używać danej konstrukcji. Wpleść w ten tekst kody tak, by wyjaśniały, co trzeba, a jednocześnie były zgodne z wymogami wydawnictwa. I wreszcie sformatować to wszystko, co samo w sobie też zajmowało sporo czasu.

Były momenty, kiedy oboje mieliśmy dość. Kiedy ja płakałam, a tata rzucał w gniewie słuchawką. Kiedy krzyczałam – ze zmęczenia i frustracji – a tata próbował mnie uspokoić. Ale prace posuwały się naprzód. Zbyt wolno. Termin gonił. W listopadzie rozmawiałam z szefem pod kątem ewentualnego urlopu bezpłatnego, bo coraz bardziej byłam przekonana, że nie zdążę. Rezygnowałam niemal ze wszystkiego, odrzucałam zaproszenia od przyjaciół, zaniedbywałam swoje zwierzaki, skracałam rozmowy telefoniczne, jedyną przyjemnością, na jaką sobie pozwalałam, były warsztaty teatralne, warsztaty improwizacji i bibliodrama. Miałam wyrzuty sumienia, ale musiałam mieć jakąś odskocznię.

To była wyczerpująca, ciężka praca, zajmująca każdą wolną chwilę. Soboty, niedziele, wieczory. Po ośmiu godzinach siedzenia przy komputerze wracałam do domu, by znów siąść przed komputerem do pracy. Nie powtórzyłabym tego, nie dałabym rady. Ale było warto.

Początek końca, czyli demoniczny korektor

Pod koniec grudnia, kilka dni przed terminem (dzięki rezygnacji z dołączenia do książki pewnych dodatkowych elementów) wysłałam finalną wersję książki do wydawnictwa. Myślałam, że to koniec problemów. Ale znów się myliłam.

Wymiana maili z przedstawicielką wydawnictwa przebiegała pomyślnie i bezproblemowo. Problemy zaczęły się dopiero, kiedy dotarliśmy do etapu korekty. Korektor bardzo mi się naraził, od samego początku. Wysłał mi teksty do korekty w poniedziałek. Tego samego dnia napisałam mu grzecznie, że sprawdziłam, ile dałam radę, a resztę doślę w piątek i w weekend (kolejne trzy dni miałam wracać bardzo późno). A on, że nie mogę, bo on ma termin i że zaraz wyśle mi jeszcze drugą połowę materiałów. Cóż… nie miałam zamiaru rezygnować dla niego ze swoich planów i spraw ani zarywać nocy (i tak już zbyt krótkich), więc napisałam do wydawnictwa, że proszę o przesunięcie mu terminu, skoro się nie wyrabia. Na co uzyskałam grzeczną odpowiedź, że oczywiście, mam pracować w swoim tempie i nie przejmować się nadgorliwym panem, który najwyraźniej nie otrzymał dokładnych informacji o zasadach współpracy.

Nie wiem, czy był to efekt tej kłótni, czy osobowości korektora, ale to nie był koniec problemów. Korektor uparł się, że musi dokonać jak najwięcej zmian, wobec tego robił dziwne rzeczy w rodzaju zamiany wszystkich “stworzyć” na “utworzyć” i odwrotnie – w miejscach, gdzie nie było to niczym uzasadnione. Dwukrotnie dokonał sobie samodzielnej zmiany kodu, który w efekcie stracił całkowicie sens i przestał się kompilować (przestawił nawiasy, usunął słowko new w deklaracji nowego obiektu itp.). Na szczęście sprawdzałam tekst odesłany mi po korekcie, obserwując wszystkie zmiany, a nie jedynie przeglądając komentarze. Nie mam pewności, czy czegoś nie przepuściłam, bo byłam już zmęczona, a wiadomo, że uwaga wtedy szwankuje. Ale mam nadzieję, że nie.

Nareszcie koniec!

I wreszcie nadszedł dzień, kiedy mogłam odetchnąć z ulgą. Książka była gotowa. Pozostały już tylko drobnostki, w postaci przejrzenia gotowej makiety książki czy zaakceptowania stworzonej przez grafika okładki. Książka jest dostępna na stronie Helionu. Bardzo ją Wam polecam. Mimo że dotyczy Javy 9, jest kompatybilna z najnowszą wersją JavaFX, z uwzględnieniem zmian, o których możesz przeczytać w tekście o zmianach w JavaFX – ich realizację znajdziecie w artykule Aktualność książki “JavaFX 9. Tworzenie graficznych interfejsów użytkownika”. Wiele godzin mojej i taty pracy nie poszło na marne – książka jest napisana przystępnym językiem, tłumaczy zagadnienia w prosty, jasny sposób i pozwala szybko nauczyć się korzystania z funkcjonalności JavaFX. Można ją traktować jako podręcznik, czytając krok po kroku, ale też nic nie stoi na przeszkodzie, by korzystać z niej, szukając konkretnych zagadnień. Było ciężko, ale efekt naprawdę wart jest polecenia.

Oprócz książki Helion udostępnia też pliki z kodami źródłowymi. Warto je pobrać, bardzo się przy nich napracowaliśmy, ale w efekcie powstał kod, który ułatwia zrozumienie treści znajdujących się w książce. Wszystkie kody można uruchomić i zobaczyć w praktyce, jak działają poszczególne elementy JavaFX. Pliki znajdują się tutaj:

Co się zmieniło?

Jak pewnie wiecie, Java jest co jakiś czas aktualizowana i pojawiają się nowe jej wersje. Jeśli popatrzycie tylko na numerki, to można odnieść wrażenie, że książka jest już dawno nieaktualna. Ale to nieprawda. Owszem, trochę rzeczy się zmieniło – ale wcale nie aż tak dużo. I choć nie planujemy w najbliższym czasie wydawania kolejnej wersji książki, to chcemy, żebyście wciąż mogli korzystać z zawartych w niej informacji. Dlatego specjalnie dla Was zamieściliśmy informacje o zmianach w Java FX od JavaFX 9 aż do najnowszej wersji, a także zaktualizowaliśmy kody i opisaliśmy zmiany dotyczące samej książki.

Nowa wersja książki

W sprzedaży jest już też dostępna nowa, zaktualizowana wersja książki, zgodna z wersją JavaFX 17:

Kody do nowej książki znajdziecie tutaj:

A jeśli chcielibyście ściągnąć sobie pełny projekt IntelliJ IDEA z kodami przykładów, to jest dostępny tutaj:

Kod w Kotlinie można ściągnąć stąd:

Jeśli chciałbyś wiedzieć, jak zamienić kod JavaFX na Kotlina, to instrukcja znajduje się w tym artykule.