Celem laboratorum jest zapoznanie się z frameworkiem JavaFX, służącym do budowy aplikacji okienkowej.
Treść laboratorium powstała we współpracy z Norbertem Morawskim.
- JavaFX to framework do obsługi środowiska graficznego.
- Aplikacja JavaFX składa się z:
Stage
- okno aplikacji,Scene
- aktualna zawartość aplikacji (np. ekran symulacji, ekran podsumowania)- Scena zawiera wiele instancji
Node
. Są nimi m.in. przyciski, pola tekstowe, kontenery (VBox
,HBox
,GridPane
, itp.).
- Główna klasa w aplikacji powinna dziedziczyć po
Application
i implementować metodęstart()
. - Minimalna aplikacja powinna stworzyć jedną scenę, przypiąć ją do
Stage
i wyświetlić.
- W
build.gradle
:- Dodaj
id 'org.openjfx.javafxplugin' version '0.0.10'
do sekcjiplugins
. - Dodaj pod
repositories
sekcję:javafx { version = "17" modules = [ 'javafx.controls' ] }
- Dodaj
- Utwórz nowy pakiet
agh.ics.oop.gui
. - Odśwież konfigurację Gradle'a (
Ctrl+Shift+O
). - Utwórz klasę
App
dziedziczącą zApplication
z pakietujavafx.application
. - Zaimplementuj metodę
public void start(Stage primaryStage)
.- Będzie to metoda uruchamiająca interfejs graficzny Twojej aplikacji.
- Na razie możesz w ciele metody wpisać
primaryStage.show();
. Wyświelti to puste okno aplikacji.
- W metodzie
main
wWorld
dodajApplication.launch(App.class, args);
- Spowoduje to uruchomienie okna JavaFX.
- Zobacz czy okno pokazuje się (może być nieresponsywne, ale powinno się pokazać).
Pamiętaj, żeby importować brakujące klasy z pakietu
javafx
- W klasie
App
dodaj:Spowoduje to:Label label = new Label("Zwierzak"); Scene scene = new Scene(label, 400, 400); primaryStage.setScene(scene); primaryStage.show();
- Utworzenie nowej etykiety z treścią
Zwierzak
. - Utworzenie sceny zawierającej tylko obiekt
Label
, z wymiarami 400 x 400 pikseli. - Ustawienie sceny jako aktywnej.
- Pokazanie okna aplikacji.
- Utworzenie nowej etykiety z treścią
- Zmodyfikuj kod tak, aby zamiast pojedynczej etykiety wyświetlał siatkę z etykietami.
- Wskazówka: Skorzystaj z klasy
GridPane
. Przydatne może być ustawieniegrid.setGridLinesVisible(true);
.
- Wskazówka: Skorzystaj z klasy
- Przenieś kod inicjalizacyjny mapy z klasy
World
doApp
(możesz skorzystać z metodyinit()
). - Użyj
getParameters().getRaw()
żeby odczytać parametry linii komend. - Wykorzystaj
AbstractWorldMap
, tak aby siatka odpowiadała rozmiarom i orientacji mapy. Pamiętaj, że współrzędney
rosną w kierunku "do góry", wGridPane
jest na odwrót. - Dodaj w pierwszej kolumnie i w pierwszym rzędzie wartości współrzędnych (podobnie jak robi to
MapVisualizer
). - Do pozostałych wierszy dodaj obiekty z mapy.
- Dodaj do siatki rozmiary kolumn i wierszy. Skorzystaj z:
grid.getColumnConstraints().add(new ColumnConstraints(width));
grid.getRowConstraints().add(new RowConstraints(height));
- Wyśrodkuj etykiety korzystając z wywołania
GridPane.setHalignment(label, HPos.CENTER)
. - Aktualnie, twój program powinien wyglądać mniej więcej tak (użyto mapy
GrassField
, dodano 2 zwierzaki):