Java EE
Transkrypt
Java EE
„Java EE – produkcja oprogramowania” INU – INTERFEJS UŻYTKOWNIKA BUDOWA PROGRAMU W JAVAFX Warszawa, 2016Z Budowa programu w JavaFX 1/3 Wszystkie aplikacje w JavaFX dziedziczą z klasy Application. Klasa programu woła metodę launch, które najpierw woła metodę init i następnie metodę start. Kiedy aplikacja kończy działanie, wołana jest metoda stop. Metoda start jest abstrakcyjna i musi być nadpisana. public class Main extends Application { public static void main(String[] args) { System.out.println("launch"); launch(args); } @Override public void init() { // Java Network Launching Protocol Parameters params = getParameters(); System.out.println("init"); } launch = @Override public void stop() { System.out.println("stop"); } } init start stop 2 @Override public void start(Stage primaryStage) { System.out.println("start"); Platform.exit(); } Budowa programu w JavaFX 1/3 Wszystkie aplikacje w JavaFX dziedziczą z klasy Application. Klasa programu woła metodę launch, które najpierw woła metodę init i następnie metodę start. Kiedy aplikacja kończy działanie, wołana jest metoda stop. Metoda start jest abstrakcyjna i musi być nadpisana. public class Main extends Application { public static void main(String[] args) { System.out.println("launch"); launch(args); } usr/local/java/default @Override public void init() { // Java Network Launching Protocol Parameters params = getParameters(); System.out.println("init"); } launch = @Override public void stop() { System.out.println("stop"); } } init start stop 3 @Override public void start(Stage primaryStage) { System.out.println("start"); Platform.exit(); } Budowa programu w JavaFX 2/3 @Override public void start(Stage primaryStage) { System.out.println("start"); primaryStage.setTitle("JavaFx"); primaryStage.centerOnScreen(); primaryStage.alwaysOnTopProperty(); primaryStage.setWidth(300); primaryStage.setHeight(100); primaryStage.show(); } 4 Klasa Stage reprezentuje okno aplikacji, kontener (na najwyższym poziomie) zawierający wszystkie obiekty interfejsu użytkownika. W chwili uruchamiania aplikacji, tworzony jest obiekt klasy Stage i przekazywany, jako parametr wywołania do metody start. Klasa Stage zawiera podstawowe własności okna aplikacji: tytuł, ikonę, dekoracje, skalowalność, widoczność. Główne okno aplikacji uzupełniane jest kontrolkami interfejsu użytkownika i wyświetlane za pomocą metody show. W czasie działania aplikacja może tworzyć inne obiekty klasy Stage. Budowa programu w JavaFX 3/3 Obiekt klasy Scene zawiera kontent okna (napisy, obrazy, kontrolki) zorganizowane w formie struktury drzewiastej tzw. grafie sceny. Węzłami grafu sceny są obiekty typu Group i Node. Węzły typu Group mogą zawierać węzły potomne. Węzły typu Node są liśćmi grafu sceny. Konstruktor klasy Scene wymaga podania referencji do korzenia grafu sceny. Referencja do obiektu typu Scene przekazywana jest do obiektu typu Stage. Obiekt klasy Layout zarządza rozkładem napisów, obrazów, kontrolek okna. 5 Obiekt klasy Control reprezentuje kontrolki np. przyciski, etykiety, listy. Przykład: okno aplikacji import import import import import javafx.application.*; javafx.stage.*; javafx.scene.*; javafx.scene.layout.*; javafx.scene.control.*; public class Click extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("JavaFX"); primaryStage.show(); } 6 } Przykład: przycisk i układ sceny Button btnOK; @Override public void start(Stage primaryStage) { //przycisk btnOK = new Button(); btnOK.setText("Kliknij!"); btnOK.setOnAction( e->btnOK_Click() ); //kontener na kontrolki, zarządza układem sceny BorderPane borderPane = new BorderPane(); borderPane.setCenter(btnOK); Scene scene = new Scene(borderPane, 300, 200); } 7 primaryStage.setScene(scene); primaryStage.setTitle("JavaFX"); primaryStage.centerOnScreen(); primaryStage.show(); Przykład: procedura obsługi zdarzenia public void btnOK_Click() { if (btnOK.getText() == "Kliknij!") btnOK.setText("Brawo!"); else btnOK.setText("Kliknij!"); 8 } Ćwiczenie Bazując na poprzednim programie oraz wiedząc, że obiekt kontrolki etykiety jest konstruowany poleceniem: Label lblCounter = new Label("Licznik"); dodaj wyświetlanie wartości zmiennej typu całkowitoliczbowego zliczającej kliknięcia przycisku. Dodaj drugi przycisk zmniejszający wartość licznika. Wskazówki projektowe: a) zadeklaruj zmienną licznika int intCounter = 0; b) użyj zarządcy układu FlowPane np. 9 FlowPane flowPane = new FlowPane(Orientation.HORIZONTAL, 10, 10, btnAdd, btnSub, lblCounter); Rozwiązanie import import import import import import import import import 1/2 javafx.application.Application; javafx.geometry.Insets; javafx.geometry.Orientation; javafx.geometry.Pos; javafx.scene.Scene; javafx.scene.control.Button; javafx.scene.control.Label; javafx.scene.layout.FlowPane; javafx.stage.Stage; Button btnAdd = new Button("Add"); Button btnSub = new Button("Sub"); Label lblCounter = new Label("0"); int intCounter = 0; 10 public class Main extends Application{ public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { btnAdd.setOnAction(e -> btnAdd_Click()); btnSub.setOnAction(e -> btnSub_Click()); FlowPane flowPane = new FlowPane(Orientation.HORIZONTAL, 10, 10, btnAdd, btnSub, lblCounter); flowPane.setPadding(new Insets(20, 20, 20, 20)); flowPane.setAlignment(Pos.CENTER); Scene scene = new Scene(flowPane); primaryStage.setScene(scene); primaryStage.setTitle("Counter"); primaryStage.centerOnScreen(); primaryStage.show(); } public void btnAdd_Click() { lblCounter.setText(Integer.toString(++intCounter)); } public void btnSub_Click() { lblCounter.setText("" + --intCounter); } } 2/2 11 Rozwiązanie @Override public void start(Stage primaryStage) { btnAdd.setOnAction(e -> btnAdd_Click()); btnSub.setOnAction(e -> btnSub_Click()); FlowPane flowPane = new FlowPane(Orientation.HORIZONTAL, 10, 10, btnAdd, btnSub, lblCounter); flowPane.setPadding(new Insets(20, 20, 20, 20)); flowPane.setAlignment(Pos.CENTER); Scene scene = new Scene(flowPane); primaryStage.setScene(scene); primaryStage.setTitle("Counter"); primaryStage.centerOnScreen(); primaryStage.show(); } public void btnAdd_Click() { lblCounter.setText(Integer.toString(++intCounter)); } public void btnSub_Click() { lblCounter.setText("" + --intCounter); } } 2/2 12 Rozwiązanie