JavaFX Ett ramverk för grafiska användargränssnitt. Föreläsning 7 Innehåll. Använda JavaFX Kommentar. En JavaFX-applikation

Relevanta dokument
Föreläsning 6 Innehåll

Föreläsning 7 Innehåll. JavaFX Ett ramverk för grafiska användargränssnitt. Använda JavaFX Kommentar. En JavaFX-applikation

Föreläsning 6 Innehåll

Föreläsning 7 Innehåll

Föreläsning 6 Innehåll. JavaFX Ett ramverk för grafiska användargränssnitt. En JavaFX-applikation. Använda JavaFX Kommentar

Föreläsning 7 Innehåll. JavaFX i Java Ett ramverk för grafiska användargränssnitt. Använda JavaFX. Använda JavaFX Kommentar

Seminarium 8 Innehåll

Grafiska användargränssitt och händelsehantering

Grafiska användargränssnitt i Java

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Grafiska användargränssnitt i Java

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Grafiska användargränssnitt i Java

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

Grafiska användargränsnitt i Java. Föreläsning 7 Innehåll. Använda klasspaketet Swing. Klasspaket i Java. Grafiska användargränsnitt i Java

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Objektorienterad Programmering DAT043. Föreläsning 5 29/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

2I1049 Föreläsning 8. Grafiska gränssnitt i Java. AWT-komponenter. Grafiska gränssnitt, Java interface och händelsehantering

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Lab5 för prgmedcl04 Grafik

Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Windows Forms Winstrand Development

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Föreläsning 3: Händelsestyrda program och användargränssnitt

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Föreläsning 5-6 Innehåll

Föreläsning 13 Innehåll

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 3-4 Innehåll

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Mer om grafiska komponenter. Händelsestyrda program

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

TENTAMEN OOP

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

DAT043 - Föreläsning 7

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lektion Händelsehanterare

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningar till tentamen i EDAF25

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 18

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

Föreläsning 4 Innehåll

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Tentamen i Objektorienterad programmering

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. LayoutManagers. Exempel på några av komponenterna

Laboration 1: Figurer i hierarki

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Laboration 3 GUI-programmering

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Klassen javax.swing.timer

Objektorienterad Programmering DAT043. Föreläsning 6 30/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Lösningar till tentamen i EDAF25

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

DAT043 - föreläsning 8

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Föreläsning 2, vecka 8: Repetition

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Händelsestyrda program

FactoryCast HMI. Premium & Quantum PLC. Applets

Föreläsnings 9 - Exceptions, I/O

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Föreläsning REPETITION & EXTENTA

PROGRAMMERINGSTEKNIK TIN212

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Transkript:

Föreläsning 7 Innehåll JavaFX Ett ramverk för grafiska användargränssnitt Grafiska användargränsnitt i Java Orientering om JavaFX (ett ramverk för grafiska användargränssnitt) Komponenter (fönster, knappar, ) Layout Händelsehantering (Hur man får någonting att hända när användaren t.ex. klickar på en knapp.) Callback-metoder (som vi skriver, men som anropas av ramverket) Anonyma klasser, lambdauttryck JavaFX är ett ramverk för grafiska användargränssnitt (eng. Graphical User Interface GUI). Standard från Java 8. Vanligast i nya projekt. Andra ramverk Android Swing AWT (Abstract Window Toolkit) Delar av det används fortfarande i Swing (händelsehantering och layout). Datavetenskap (LTH) Föreläsning 7 HT 2018 1 / 51 Använda JavaFX Kommentar Datavetenskap (LTH) Föreläsning 7 HT 2018 2 / 51 En JavaFX-applikation import javafx.application.application; import javafx.scene.scene; import javafx.stage.stage; public class MyApp extends Application { Ramverket JavaFX innehåller många klasser. Ambitionen här är att visa hur man skriver en liten applikation i JavaFX samt ge smakprov på några olika slags komponenter. På nätet finns tutorials och dokumentation. Några länkar når du via kursens hemsida: cs.lth.se/edaa30/laenkar/ HBox root = new HBox(); // eller annan komponent // Skapa ytterligare komponenter och lägg till dem i root Scene scene = new Scene(root, 200, 80); stage.setscene(scene); stage.settitle("hello World"); stage.show(); public static void main(string[] args) { launch(args); Datavetenskap (LTH) Föreläsning 7 HT 2018 3 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 4 / 51

En JavaFX-applikation Metoden start Vår egen klass MyApp är en subklass till Application. start är en abstrakt metod i Application och måste implementeras: Via parametern stage får man tillgång till ett Stage-objekt. Stage-objektet instansieras av ramverket och är en top level -behållare som innehåller det som ska visas i fönstret. En komponent (rot) som i sin tur kan innehålla komponenter skapas. Ett Scene-objekt kopplad till rot-komponenten skapas. Metoden setscene anropas för att koppla Scene-objektet till stage. stage.show() anropas för att visa fönstret. En JavaFX-applikation Metoderna init och stop I klassen Application finns också metoderna init och stop. De ärvs från Application och behöver inte implementeras. init anropas innan JavaFX har satt upp ramverket. stop anropas när programmet avslutas. Här kan du t.ex. spara data på fil. public class MyApp extends Application { public void init() { public void stop() { Analogi med teater: På ett scengolv (stage) kan en eller flera scener (scene) visas. public static void main(string[] args) { launch(args); Datavetenskap (LTH) Föreläsning 7 HT 2018 5 / 51 En JavaFX-applikation Metoden launch Trådar Datavetenskap (LTH) Föreläsning 7 HT 2018 6 / 51 I main-metoden ska metoden Application.launch() anropas. main behöver inte ligga i MyApp. Du kan även starta JavaFX med Application.launch(MyApp.class, args). launch gör följande: skapar en instans av MyApp anropar init anropar start väntar på att JavaFX-applikationen ska avslutas vilket inträffar när något av följande inträffar Platform.exit() anropas sista fönstret stängts anropar stop Trådar används om ett program ska utföra olika uppgifter samtidigt. Processorn exekverar var och en av trådarna en kort stund i taget. För användaren ser det ut som om processorn utför de olika uppgifterna samtidigt. JavaFX använder flera trådar. Alla JavaFX-objekt måste skapas i Application.start() eller i en händelsehanterare (beskrivs senare). Datavetenskap (LTH) Föreläsning 7 HT 2018 7 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 8 / 51

Scengraf De grafiska komponenterna som visas på skärmen representeras av objekt. Objekten arrangeras i en hierarkisk, trädformad struktur - scengrafen. Scengrafen består av olika noder: Löv Rot Löv Gren Löv Exempel: Button HBox Label Scene-objektet är behållare för allt innehåll i scengrafen. JavaFX ritar automatiskt alla komponenter, uppdaterar vid behov, t.ex. när fönstrets storlek ändras. Grafiska komponenter Exempel, fler finns Styrkomponenter Används för att interagera med användare. Finns i paketet javafx.scene.control Ex: knappar, menyer, textrutor Reagerar på händelser (musklick, menyval,... ). Former Geometriska former som ritas, men som användaren inte kan påverka. Ex. rektangel, linje och cirkel Finns i paketet javafx.scene.shape Behållarkomponenter Kan innehålla andra komponenter och används för att organisera komponenter. Ofta osynliga Lägg till barn med metoderna getchildren().addall() eller getchildren().add() Datavetenskap (LTH) Föreläsning 7 HT 2018 9 / 51 Behållarkomponenter Datavetenskap (LTH) Föreläsning 7 HT 2018 10 / 51 Avsluta program javafx.scene.control.control Objekt som användaren interagerar med. Exempel MenuBar, ToolBar, TabPane. javafx.scene.layout.region anpassar storlek när fönstret ändras. Subklasser till Region placerar barnen enligt en layout StackPane, HBox, VBox, TilePane, FlowPane, BorderPane, GridPane, och AnchorPane. javafx.scene.group Fix storlek, ändras inte när fönstret ändras. Ett JavaFX-program avslutas när alla fönster stängts, av användaren eller programmet. Om du vill avsluta programmet, t.ex. från en händelsehanterare, anropar du Platform.exit(). stop i din Application-klass anropas i båda fallen ovan. Om du anropar System.exit(status) kommer stop inte att anropas. Datavetenskap (LTH) Föreläsning 7 HT 2018 11 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 12 / 51

Behållarkomponenter med layout Exempel: BorderPane Vissa behållarkomponenter har en layout som bestämmer storlek och läge för komponenterna i behållaren. De räknar också ut nya positioner och storlekar om fönstrets storlek ändras. Olika typer av behållarkomponenter har olika strategier för placering av komponenterna. Ex: BorderPane delar utrymmet i fem delar; norr, söder, öster, väster och mitten. FlowPane komponenterna placeras i en rad efter varandra. HBox horisontell rad. VBox vertikal rad. GridPane rutnät. TilePane rutnät, alla rutor lika stora. AnchorPane ankrat till sida/hörn. BorderPane root = new BorderPane(); root.settop(new Button("Top")); root.setleft(new Button("Left")); root.setcenter(new Button("Center")); root.setright(new Button("Right")); root.setbottom(new Button("Bottom")); root.setprefsize(200, 100); Datavetenskap (LTH) Föreläsning 7 HT 2018 14 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 13 / 51 Exempel: FlowPane FlowPane - ändring av layouten när fönstret ändrar storlek FlowPane root = new FlowPane(); root.sethgap(10); root.setvgap(10); root.setpadding(new Insets(10, 10, 10, 10)); for(int i = 1; i<= 5; i++){ root.getchildren().add(new Button("box " + i)); Datavetenskap (LTH) Föreläsning 7 HT 2018 15 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 16 / 51

Exempel: GridPane Exempel: TilePane Rader och kolumner kan ha olika storlek. GridPane root = new GridPane(); root.sethgap(10); root.setvgap(10); root.setpadding(new Insets(10, 10, 10, 10)); root.add(new Button("one"), 0, 0); root.add(new Button("2"), 1, 0); root.add(new Button("three"), 2, 0); root.add(new Button("four"), 0, 1); root.add(new Button("5"), 1, 1); root.add(new Button("six"), 2, 1); Som GridPane, men cellerna har samma storlek. TilePane root = new TilePane(); root.setprefcolumns(8); root.setprefrows(8); final int SIZE = 40; for (int i = 0; i < 8; i++) { for (int k = 0; k < 8; k++) { Label label = new Label(); label.setprefsize(size, SIZE); if ((i + k) % 2 == 0) { label.setstyle("-fx-background-color: #000000;"); root.getchildren().add(label); stage.setresizable(false); Datavetenskap (LTH) Föreläsning 7 HT 2018 17 / 51 Exempel: Nästlade layouthanterare HBox topbox = new HBox(); topbox.setpadding(new Insets(12, 12, 12, 12)); topbox.setspacing(5); topbox.setalignment(pos.center); topbox.setstyle("-fx-background-color: #adcab8;"); topbox.getchildren().addall(new Button("1"), new Button("2")); HBox bottombox = new HBox(); bottombox.getchildren().addall(new Button("3"), new Button("4"), new Button("5")); BorderPane root = new BorderPane(); root.settop(topbox); root.setbottom(bottombox); root.setprefsize(200, 100); Datavetenskap (LTH) Föreläsning 7 HT 2018 19 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 18 / 51 JavaFX och CSS Man kan ändra utseende på det grafiska användargränssnittet med hjälp av stilmallar, CSS (Cascading Style Sheets). Exempel: Label label = new Label("Hello world!"); label.setstyle("-fx-background-color: lightgrey;" + "-fx-text-fill: #ff7f50;" + "-fx-font-size: 24; -fx-label-padding: 10;" + "-fx-border-color: black;"); Pane root = new StackPane(); root.getchildren().add(label); Scene scene = new Scene(root, 200, 80); stage.setscene(scene); stage.settitle("hello"); stage.show(); Datavetenskap (LTH) Föreläsning 7 HT 2018 20 / 51

JavaFX och CSS Style sheet Alternativt kan man lägga CSS-koden i en fil. Antag att filen scene.css innehåller:.my-label { -fx-background-color: lightgrey; -fx-text-fill: #ff7f50; -fx-font-size: 24; -fx-label-padding: 10; -fx-border-color: black; Då kan man skriva så här i start-metoden: label.getstyleclass().add("my-label"); // Ger etiketten en identifierare som används i stilmallen scene.getstylesheets().add("scene.css"); // Laddar stilmallen i filen scene.css Datavetenskap (LTH) Föreläsning 7 HT 2018 21 / 51 Händelsehantering Exempel: Fönster med en knapp public class CounterView extends Application { Button button = new Button("Yes!"); Label label = new Label("0"); HBox root = new HBox(); root.setspacing(20); root.setalignment(pos.center); root.getchildren().addall(button, label); Scene scene = new Scene(root, 200, 80); stage.setscene(scene); stage.settitle("counter"); stage.show(); public static void main(string[] args) { launch(args); Datavetenskap (LTH) Föreläsning 7 HT 2018 22 / 51 Lyssnarobjekt När användaren klickar på en knapp, väljer ett menyalternativ... händer följande: 1 Ett händelseobjekt skapas. 2 JavaFX-systemet anropar en callback-metod på de lyssnarobjekt som är knutna till komponenten. Ett lyssnarobjekt är ett objekt av en klass som implementerar interfacet: public interface EventHandler<T extends Event> { void handle(t event); Ett lyssnarobjekt kan knytas till en eller flera komponenter (t.ex. en knapp). När komponentens händelse inträffar (t.ex. när någon klickar på knappen) anropas callback-metoden handle. Det är alltså i metoden handle vi ska skriva vad som ska hända när man klickar på knappen. En komponent kan ha flera lyssnarobjekt, alla anropas. Event är superklass för händelseklasserna i JavaFX. Den händelseklass som ska användas här är ActionEvent. Datavetenskap (LTH) Föreläsning 7 HT 2018 23 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 24 / 51

Händelsehantering Exempel på händelsehantering Klassen CounterView För att få någonting att hända när användaren klickat på en knapp måste man: Skriva en klass som implementerar interfacet EventHandler. I callback-metoden handle skriver man det man vill ska hända när användaren klickar på knappen. Koppla lyssnar-objektet till knappen genom att anropa metoden setonaction. public class CounterView extends Application { private Button button; private Label label; private int counter; private class ButtonHandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent event) { label.settext(integer.tostring(counter)); /** se nästa sida **/ Datavetenskap (LTH) Föreläsning 7 HT 2018 25 / 51 Exempel på händelsehantering Klassen CounterView, start-metoden button = new Button("Yes!"); button.setonaction(new ButtonHandler()); label = new Label("0"); HBox root = new HBox(); root.setspacing(20); root.setalignment(pos.center); root.getchildren().addall(button, label); Scene scene = new Scene(root, 200, 80); stage.setscene(scene); stage.settitle("counter"); stage.show(); public static void main(string[] args) { launch(args); Datavetenskap (LTH) Föreläsning 7 HT 2018 27 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 26 / 51 Händelsehantering Kommentar Tidigare har vi vant oss vid att det är vi som styr vad som ska hända i programmet genom att skriva kod för att fråga användaren om olika indata etc. Nu vänder vi på det hela. Det är användaren som styr vad som ska hända genom att klicka på en viss knapp, välja ett menyalternativ etc. Vi fyller i vad som ska hända i de olika fallen genom att implementera callback-metoder i lyssnarklasser. Datavetenskap (LTH) Föreläsning 7 HT 2018 28 / 51

Anonyma klasser Funktionella interface Klasser som bara instansieras en gång behöver inte namnges och kan skapas direkt ( inline ) vid new. button.setonaction(new EventHandler<ActionEvent>() { public void handle(actionevent event) { label.settext(integer.tostring(counter)); ); Det blir nu tydligare vilken funktionalitet som kopplas till knappen. Ett interface med en enda abstrakt metod kallas funktionellt interface. Interfacet EventHandler har bara den abstrakta metoden handle och är därför ett funktionellt interface: public Interface EventHandler<T extends Event> { void handle(t event); Ett annat exempel på ett funktionella interface i Java är Comparator<T>. Datavetenskap (LTH) Föreläsning 7 HT 2018 29 / 51 Lambdauttryck Datavetenskap (LTH) Föreläsning 7 HT 2018 30 / 51 Lambdauttryck Vi såg tidigare hur man kunde skapa ett lyssnarobjekt av typen EventHandler genom att skriva en anonym klass: button.setonaction(new EventHandler<ActionEvent>() { public void handle(actionevent event) { label.settext(integer.tostring(counter)); ); Eftersom interfacet EventHandler är ett funktionellt interface kan man förenkla ytterligare genom att använda ett lambdauttryck: button.setonaction(event -> { label.settext(integer.tostring(counter)); ); Lambdauttryck infördes i Java 8. Förenklat sett är lambdauttryck anonyma klasser där man bara skriver innehållet i en metod. Kompilatorn listar ut vilken metod och alla typer från sammanhanget. button.setonaction(event -> { label.settext(integer.tostring(yescounter)); ); Lambdauttryck skapar objekt, d.v.s. används normalt istället för new. Datavetenskap (LTH) Föreläsning 7 HT 2018 31 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 32 / 51

Lambdauttryck Syntax Lambdauttryck skrivs på formen (formella parametrar) -> metodkropp Exempel: (ActionEvent event) -> { label.settext(integer.tostring(counter)); Typer på parametrar behöver inte anges om de är otvetydiga: (event) -> Är det bara en parameter kan även () utelämnas: event -> Lambdauttryck Syntax, forts Metodkroppen består av ett block: (a, b) -> { return a.length() - b.length(); eller ett uttryck: (a, b) -> a.length() - b.length() Exempel: Om metodkroppen består av ett uttryck ska även return utelämnas. String[] words = {"AA", "EEE","B", "CCCCC", "DDDD"; Arrays.sort(words, (a, b) -> a.length() - b.length()); Datavetenskap (LTH) Föreläsning 7 HT 2018 33 / 51 Lambdauttryck Restriktioner i Java I ett lambda-uttryck kan man använda attribut i den omgivande klassen variabler som är deklarerade final eller som ej ändras ( effectively final ) i den omgivande metoden. Så här kan man göra: int n = 10; list.foreach(e -> System.out.println(e + n)); Datavetenskap (LTH) Föreläsning 7 HT 2018 34 / 51 Händelsehantering - flera komponenter Man kan ha flera komponenter som genererar händelser. T.ex. olika knappar, textfält, menyer,... Olika saker ska hända beroende på vilken av komponenterna som genererade händelsen. Men inte så här: int n = 10; n = 20; // värdet på n ändras här list.foreach(e -> System.out.println(e + n)); och inte heller så här: int n = 0; list.foreach(e -> n += e); // värdet på n ändras här Datavetenskap (LTH) Föreläsning 7 HT 2018 35 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 36 / 51

Flera komponenter med var sin lyssnare Klassen CounterView public class CounterView extends Application { private Button yesbutton, nobutton; private Label yeslabel, nolabel; private int yescounter, nocounter; yesbutton = new Button("Yes!"); public static void main(string[] args) { launch(args); Datavetenskap (LTH) Föreläsning 7 HT 2018 37 / 51 Diskutera Duplicerad kod Den lösning vi visat innehåller en hel del duplicerad kod, två knappar, två etiketter, två räknare Den enda skillnaden är namnet på knapparna. Koden blir onödigt lång och förändringar innebär att man måste göra samma ändring på flera ställen i koden. Ännu värre blir det om vi lägger till en tredje knapp. Hur ska vi möblera om i koden för att lösa det? Datavetenskap (LTH) Föreläsning 7 HT 2018 39 / 51 Flera komponenter med var sin lyssnare Klassen CounterView, metoden start yesbutton = new Button("Yes!"); yesbutton.setonaction(event -> { yescounter ++; yeslabel.settext(integer.tostring(yescounter)); ); yeslabel = new Label("0"); nobutton = new Button("No!"); nobutton.setonaction(event -> { nocounter ++; nolabel.settext(integer.tostring(nocounter)); ); nolabel = new Label("0"); Datavetenskap (LTH) Föreläsning 7 HT 2018 38 / 51 Undvik duplicerad kod Klassen CounterPane med räknare, knapp och etikett public class CounterPane extends HBox { private int counter = 0; private Button button; private Label label; public CounterPane(String s) { button = new Button(s); button.setonaction(event -> { label.settext(integer.tostring(counter)); ); label = new Label("0"); setpadding(new Insets(10, 10, 10, 10)); setspacing(20); setalignment(pos.center_left); getchildren().addall(button, label); Datavetenskap (LTH) Föreläsning 7 HT 2018 40 / 51

Undvik duplicerad kod Kortare metod start i klassen CountersView public class CountersView extends Application { @Override VBox root = new VBox(); root.getchildren().add(new CounterPane("Yes")); root.getchildren().add(new CounterPane("No")); root.getchildren().add(new CounterPane("Neutral")); root.setprefsize(150, 100); Model-View De lösningar vi visat separerar inte det grafiska användargränssnittet (vyn) från modellen (räknarna). Oftast är önskvärt att separera dessa. Vyn kan man ofta vilja ändra medan modellen ligger fast. Vissa operationer berör bara modellen. Det blir besvärligt att implementera och testa dessa om vy och modell blandas samman. Klassen/klasserna som beskriver modellen känner inte till vyn: Scene scene = new Scene(root); stage.setscene(scene); stage.settitle("counters"); stage.show(); public static void main(string[] args) { launch(args); Datavetenskap (LTH) Föreläsning 7 HT 2018 41 / 51 Menyer MenuBar, Menu, MenuItem Model View Ibland talar man även om en kontrolldel (Model-View-Controller). Denna reagerar på användarens input, uppdaterar vyn och påverkar modellen. I praktiken är vyn och kontrollen ofta svåra att skilja åt. Datavetenskap (LTH) Föreläsning 7 HT 2018 42 / 51 Fler komponenter TextField, TextArea Menyer För att välja mellan alternativ som kan grupperas i en eller flera menyer. Händelsehantering analogt med knappar. TextField Ett editerbart textfält en rad. När användare skriver in radslutstecken genereras ActionEvent. textfield.gettext() returnerar den sträng som skrivits i fältet. Menu MenuItem MenuBar TextArea Flera rader. Kan sättas uneditable och användas för att visa flera rader text. Kan vara editable och användas för att skriva in flera rader text. Radslut genererar ActionEvent. textarea.gettext() returnerar det som skrivits (i form av en sträng). Datavetenskap (LTH) Föreläsning 7 HT 2018 43 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 44 / 51

Dialogrutor Exempel, TextInputDialog Klassen Optional<T> Behållare för resultat public void start(stage arg0) { TextInputDialog dialog = new TextInputDialog(" "); dialog.settitle("compute Square root"); dialog.setheadertext(""); dialog.setcontenttext("please enter a number:"); Optional<String> result = dialog.showandwait(); Resultatet man får från dialogrutan är ett Optional<String>-objekt. I klassen Optional<T> finns bland annat metoderna: boolean ispresent() returnerar true om det finns ett resultat, annars false (t.ex. om användaren klickat på Cancel ) T get() returnerar resultatet ifall ett sådant finns, genererar i annat fall NoSuchElementException Exempel på användning: Optional<String> result = dialog.showandwait(); if (result.ispresent()) { String s = result.get(); Datavetenskap (LTH) Föreläsning 7 HT 2018 45 / 51 Fler komponenter dialogrutor Använda Optional och Alert Optional<String> result = dialog.showandwait(); if (result.ispresent()) { try { n = Double.valueOf(result.get()); double sqrroot = Math.sqrt(n); Alert alert = new Alert(AlertType.INFORMATION); alert.settitle("result"); alert.setheadertext(null); alert.setcontenttext(double.tostring(sqrroot)); alert.showandwait(); catch (NumberFormatException e) { Alert alert = new Alert(AlertType.ERROR); alert.settitle("error in input"); alert.setheadertext(null); alert.setcontenttext("wrong input"); alert.showandwait(); Datavetenskap (LTH) Föreläsning 7 HT 2018 47 / 51 Datavetenskap (LTH) Föreläsning 7 HT 2018 46 / 51 Fler komponenter Listor ListView För att visa en skrollbar lista i en vy finns klassen ListView. Till en ListView kopplas modellen av listan av typ ObservableList<T>. ObservableList<T> är ett interface. Det finns färdiga implementeringar av interfacet t.ex. ObservableArrayList<T>. Alla modifieringar av listan (modellen) görs via operationer på den modell som kopplas till vyn. Dessa modifieringar visas automatiskt i vyn av listan. Datavetenskap (LTH) Föreläsning 7 HT 2018 48 / 51

Grafik Exempel på vad du ska kunna Man kan enkelt rita figurer som linjer, cirklar, rektanglar... De geometriska figurer finns i paketet javafx.scene.shape. Lägg till dem i scenen på samma sätt som andra GUI-komponenter, container.getchildren().add(new Circle(x, y, r)); Implementera enkla användargränsnitt med hjälp av JavaFX. Beskriva och kunna tillämpa principerna för händelsehantering i JavaFX. Kunna använda lambda-uttryck i Java. Kunna separera modell och vy (grafiskt användargränssnitt) vid implementering av program med grafiska användargränssnitt. Datavetenskap (LTH) Föreläsning 7 HT 2018 49 / 51 Datorlaboration 3 grafiska användargränssnitt JavaFX Datavetenskap (LTH) Föreläsning 7 HT 2018 50 / 51 Skapa en grafisk applikation med JavaFX från grunden, steg för steg Bygger på laboration 1: användargränssnitt för textanalysen Lambda-uttryck Valbara uppgifter: lös problem med hjälp av dokumentationen Datavetenskap (LTH) Föreläsning 7 HT 2018 51 / 51