Preview only show first 10 pages with watermark. For full document please download

Folien Ab 15.10.15

   EMBED


Share

Transcript

2. JavaFX • • • • • • Beispiel für Komponenten-Architektur Graphische Oberflächen mit Schachtel-in-Schachtel-Prinzip Konfiguration über get/set Konfiguration über FXML Event-Verarbeitung Data-Binding und Properties als Kommunikationsmechanismus Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 99 JavaFX - kurze Historie • Zunächst SWT (Abstract Window Toolkit), dann ab Java 1.2 Swing (nur in Java, gleiches Look-and-Feel) • 2008: JavaFX 1.x in eigener Sprache JavaFX Script; ursprüngliche Idee Flash abzulösen (klappt nicht wirklich, HTML 5 unendlich bessere Alternative) • 2011: JavaFX 2.0 klarer Fokus auf Client-Oberflächen; Nutzbarkeit über Browser bleibt vorhanden (Lauffähigkeit hängt von Sicherheitseinstellungen ab) • JavaFX: Trennung zwischen Spezifikation der Oberfläche und fachlichem Code; einfache Code-Anbindung an Oberfläche; gestaltbar u.a. mit CSS • Zusammenspiel mit Adobe Illustrator und Photoshop • Wenn notwendig JavaFX in Swing und auch Swing in JavaFX einbettbar (-> Migrationsprojekte) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 100 Basis-Prinzip von Oberflächen • Schachtel in Schachtel (auch hierarchisch genannt; Baum) • Jede Schachtel kann mehrere sichtbare GUI-Elemente enthalten • Jede Schachtel kann eigene Gestaltungsmöglichkeiten haben, die geerbt, vererbt und überschrieben werden • Jedem GUI-Element und jeder umgebenden Schachtel können Steuerungselemente zugeordnet werden • Jedes Steuerelemente reagieren auf einzelne Events (Knopf über Maus, linke Maustaste auf Knopf gedrückt, …) • Es kann mehrere Reaktionen auf ein Event in gleichem GUIElement und in verschiedenen oberen Schachteln geben • GUI-Elemente sind Komponenten Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 101 Erstes Beispiel (1/5) • Knopf dreht sich beim Klicken etwas um eigene Achse • Wenn Knopf wieder an Ursprungsposition, wird verbrauchte Zeit angezeigt nur eine Bühne Stage (oft) nur eine Szene Scene (meist) ab hier gestalten AnchorPane Button Komponentenbasierte SoftwareEntwicklung Label Prof. Dr. Stephan Kleuker Schachtel mit Layout GUI-Komponenten 102 Erstes Beispiel (2/5) import import import import import import import import import java.time.Duration; java.time.LocalTime; javafx.application.Application; javafx.application.Platform; javafx.scene.Scene; javafx.scene.control.Button; javafx.scene.control.Label; javafx.scene.layout.AnchorPane; javafx.stage.Stage; muss so erben public class KbSEJavaFXErsteDirekt extends Application { private double value = 0; private boolean aktiv = true; private LocalTime start = LocalTime.now(); Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker Winkel in Grad 103 Erstes Beispiel (3/5) @Override diese Methode muss überschrieben werden public void start(Stage primaryStage) { Label lbl = new Label("Zeit"); Button btn = new Button ("Dreh mich"); btn.setOnAction(e -> { ActionEvent e; Verarbeitung mit Lambda-Ausdruck if (this.aktiv) { this.value += 40; btn.setRotate(value); konfigurieren mit set if (this.value >= 360d) { this.aktiv = false; Date/Time API seit Java 8 btn.setDisable(true); Duration dur = Duration.between(start, LocalTime.now()); double zeit = dur.getSeconds()*1e9 + dur.getNano(); lbl.setText("" + zeit/1e9); } } Komponentenbasierte SoftwareProf. Dr. 104 Stephan Kleuker });Entwicklung Erstes Beispiel (4/5) lbl.setLayoutX(11); lbl.setLayoutY(79); btn.setLayoutX(27); btn.setLayoutY(33); Pane für das Layout; hinzufügen immer zu children AnchorPane root = new AnchorPane(); root.getChildren().add(btn); root.getChildren().add(lbl); Scene scene = new Scene(root, 130, 110); immer Wurzel in SceneObjekt einbetten immer eine Scene der einen Stage zuordnen primaryStage.setTitle("Dreher"); primaryStage.setScene(scene); primaryStage.setOnCloseRequest(e -> Platform.exit()); primaryStage.show(); Komponentenbasierte Software} Entwicklung Prof. Dr. Stephan Kleuker 105 Erstes Beispiel (5/5) public static void main(String[] args) { Application.launch(args); } } Genereller Aufbau • erben von Application • muss Methode überschreiben: public void start(Stage primaryStage) • kann Methoden überschreiben: public void init() public void stop() // einmal zu Beginn // einmal am Ende • Start über Application.launch() [!!!, eigener Classloader] Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 106 Erinnerung: Grundregeln der Ergonomie • Erinnern Sie sich an Regeln des guten Designs • Fast nie mit absoluten Werten arbeiten Hinweise: • Hier stehen nur Konzepte im Vordergrund • Im Mittelpunkt: Aufbau, Kombination und Kommunikation von Komponenten • Bei weitem werden nicht alle Gestaltungsmöglichkeiten vorgestellt Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 107 Aufbauvarianten für JavaFX-GUIs • grundsätzlich immer Oberfläche durch Programmierung vollständig erstellbar und damit gestaltbar • Variante: GUI-Aufbau mit FXML beschreiben – wieder Baumstruktur – viele Attribute zur detaillierten Gestaltung – Gestaltung in CSS auslagerbar („fast“ CSS3) – Verknüpfung zum Code wird über bestimmte Attribute hergestellt • FXML mit GUI-Designer-Werkzeug Scene Builder (JavaFXProgramm) erstellbar Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 108 FXML-Beispiel (1/10): Aufgabe • generell gleiche Basisaufgabe mit drehendem Knopf • verbrauchte Zeit soll mitlaufen (-> eigener Thread) • Klick auf Label (?!?) links-unten soll Programm neu starten Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 109 FXML-Beispiel (2/10): GUI.fxml (1/2) • generell sinnvoll durch Scene Builder generieren lassen • Anfang mit PI (Processing Instructions) javafx.scene.effect.*?> java.lang.*?> java.net.*?> java.util.*?> javafx.scene.*?> javafx.scene.control.*?> javafx.scene.layout.*?> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 110 FXML-Beispiel (3/10): GUI.fxml (2/2)