Grafiska användargränssitt och händelsehantering

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

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

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

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

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

Seminarium 8 Innehåll

Föreläsning 6 Innehåll

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

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

Grafiska användargränssnitt i Java

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

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

Föreläsning 7 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 6 Innehåll. JavaFX Ett ramverk för grafiska användargränssnitt. En JavaFX-applikation. Använda JavaFX Kommentar

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

Java-concept och Swing. Swing low, sweet chariot

Mer om grafiska komponenter. Händelsestyrda program

Grafiska användargränssnitt i Java

Grafiska användargränssnitt i Java

Händelsestyrda program

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

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

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

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

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

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

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

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

Lektion Händelsehanterare

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

Klasshierarkier - repetition

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

Lab5 för prgmedcl04 Grafik

Grafiska komponenter.

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

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

Konstruktion av klasser med klasser

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

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

Objektorienterad programmering Föreläsning 15. Grafiska användargränssnitt (GUI Graphical User Interface)

LiTHehack? Här? lithehack se koma Tisdagar och torsdagar

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

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

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

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

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

SMD091 Lektion 9. Definition. Inkapsling. Lite repetition. Grafik. Gränssnitt Definition och Implementation. Sammansättning... Implementation.

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

Frames, menyer och GUI-program

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

OOP Objekt-orienterad programmering

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

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

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

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers. Exempel: FlowLayout. Klassen FlowLayout

Mobila applikationer. Mobil applikationer. Java ME. Konfigurationer. Grunderna i ME

Laboration 15 Grafiskt användargränssnitt

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

Grafiskt användargränssnitt (GUI-Graphical User Interface) intro Komponenter

OOP Objekt-orienterad programmering

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers

OOP Objekt-orienterad programmering

Laboration 3 GUI-programmering

DAT043 - föreläsning 8

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Labbinstruktioner för Java/Swing

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

OOP Objekt-orienterad programmering

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Properties. Användbara metoder som kan anropas i propertychanged:

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Programstyrd / händelsestyrd

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

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

DAT043 - Föreläsning 7

Classes och Interfaces, Objects och References, Initialization

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

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

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Objektorienterad programmering med Java Swing. Programexempel. Swing och AWT AWT. = Abstract windowing toolkit

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Arv och Grafiska Användargränssnitt

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

Objektorienterad Programmering (TDDC77)

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

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

Tentamen. DD2385 Programutvecklingsteknik vt Fredagen den 5 juni 2009 kl Inga hjälpmedel utom penna, sudd och linjal

FactoryCast HMI. Premium & Quantum PLC. Applets

Delegater, events och lambdauttryck

Transkript:

Grafiska användargränssitt och händelsehantering i Java

GUI i Java AWT, Abstract Window Toolkit, java.awt Använder systemets GUI-komponeneter Swing, javax.swing Komponenter, förutom fönster, renderas av Java JavaFX, javafx och underpaket Komponenter, förutom fönster, renderas av Java JavaFX Utvecklas kontinuerligt Desktop/browser/pad: support för touch events, CSS-styling, Enklare hantering av layout Bättre grafik: rotationer, gradienter, Enklare och säkrare animering NB! Många klasser i JavaFX har samma namn som i AWT håll koll på vilket paket du importerar från

Ett tomt GUI public class EmptyStage extends Application { @Override public void start(stage primarystage) { Pane pane = new Pane(); Scene scene = new Scene(pane, 300, 200); 300 primarystage.settitle("empty stage"); primarystage.setscene(scene); primarystage.show(); 200 public static void main(string[] args) { launch(args);

public class EmptyStage extends Application { GUI i Java FX @Override public void start(stage primarystage) { Pane pane = new Pane(); Scene scene = new Scene(pane, 300, 200); primarystage.settitle("empty stage"); primarystage.setscene(scene); primarystage.show(); Ärv klassen javafx.application.application Omdefiniera metoden start Skapa ui-komponenter och placera dessa i ett Stage-objekt (fönster) Anropa stage.show Exekveringen startar genom att metoden Application.launch anropas En JavaFX-applikation exekveras i en separat tråd, UI thread, JavaFX Application thread All uppdatering av ui-komponenter måste göras från denna tråd All kod för händelshantering (event handlers) exekveras på denna tråd Långa beräkningar bör exekveras på separat tråd för att inte frysa UI Exempel: EmptyStage.java, HelloJavaFXWorld.java public static void main(string[] args) { launch(args);

Stage, Scene * Stage (extends Window) Det yttersta fönstret i applikationen Ytterligare fönster? PopupWindow Alert tillfällig meddelande/input Ytterligare Stage? Sätt modal, använd show/hide Scene En container för allt innehåll i ett scen-träd ( scene graph ) Applikationen måste ange en rot-nod för scenen, som i sin tur innehåller alla eventuella övriga komponenter Applikationen kan byta mellan olika scener för en och samma stage * Scene i svenska betydelsen en scen eller tablå i en pjäs

Tillfälliga dialogfönster Måste skapas på UI-tråden Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setheadertext("message"); alert.settitle("hello!"); alert.setcontenttext(message); alert.show(); Default är ett Alert-objekt Modalt användaren kan inte interagera med bakomliggande UI (efter alert.show) Blockerande exekveringen av huvudapplikationen pausar till dess objektet inte visas längre (ex. via alert.hide() eller användarinteraktion) Exempel: HelloJavaFXWorld.java

Node, Parent, Pane, Control Node Superklass för alla noder i ett scen-träd En ui-komponent som kan visas och agera händelsekälla Parent Subtyp till Node som kan innehålla andra noder, children (en container) Pane Subtyp till Parent som även definierar en layout-strategi, dvs. hur noder ska placeras i vyn Exempel: FlowPane, GridPane, BorderPane Control Superklass för alla komponenter för användarinteraktion, som knapp, inmatningsfält,

Scene graph Exempel UI för en enkel växlingsapplikation Motsvarande komponenthierarki, inklusive scene graph Stage Scene Parent, här GridPane Noder: Label, TextField

Scene graph (Application) private TextField skrinput; private Label usdvalue; @Override public void start(stage primarystage) { skrinput = new TextField("Enter value..."); usdvalue = new Label("- - -"); FlowPane root = new FlowPane(); Collection children = root.getchildren(); children.add(new Label("SKR")); children.add(skrinput); children.add(new Label("USD")); children.add(usdvalue); Scene scene = new Scene(root); Scene(root, 300, 300) - ger angiven storlek i pixels Scene(root) ger en storlek beräknad efter noderna som palcerats i root Kodexempel: ExchangeFlowPane.java, ExchangeGridPane.java

Layout med Pane(s) Pane (superklass) pane.getchildren().add(node) FlowPane Noderna placeras från vänster till höger så långt de får plats, sedan ny rad Inbördes placering kan ändras om användaren ändrar fönstrets dimensioner Hack: stage.setscene(new Scene(pane, 300, 300); stage.setresizable(false); GridPane Noder laceras ut i rader och kolumner: gridpane.add(node, col, row) gridpane.seth/vgap(pixels); Hbox, Vbox Noder placeras ut på en enda rad Box.setMargin(pixels) Kodexempel: ExchangeFlowPane.java, ExchangeGridPane.java, BorderPaneExample.java

Layout med Pane, forts. BorderPane Noder placeras ut med borderpane.settop(node/parent) setbottom / setleft / setright / setcenter När fönstret ändrar storlek påverkar detta främst centerregionen Flexibelt: var och en av de fem regionerna kan i sig innehålla en parent-komponent Kodexempel: BorderPaneExample.java

Layout med Pane, forts BorderPane border = new BorderPane(); Label toplabel = new Label("This is the top area"); border.settop(toplabel); FlowPane bottompane = new FlowPane(); bottompane.getchildren().add(new Button("Hit me!")); bottompane.getchildren().add(new Button("No, hit me!")); border.setbottom(bottompane); TextArea textarea = new TextArea("Bla bla bla..."); border.setcenter(textarea); Scene scene = new Scene(border);

Händelsehantering Event-objekt EventHandler-object class ButtonHandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent me) { // Take some action Händelsekälla, ex knapp eller inmatningsfält Händelse, ex knapptryck eller ENTER i inmatningsfält ett Event-objekt skapas Händelsehanterare implementerar EventHandler.handle(Event) definierar vad som ska göras

Event-typer getsource returnerar en referens till källan till händelsen geteventtype returnerar en händelses (under-) typ, ex. MouseEvent.RELEASED consume/isconsumed flera komponenter kan registrera sig att hantera en händelse, consume flaggar att händelsen inte ska hanteras vidare

Applikationsprogrammerarens jobb Skriv en klass som implementerar interfacet EventHandler< > (som en separat klass eller en inre klass) 1. class ButtonHandler implements Eventhandler<ActionEvent> { @Override public void handle(actionevent event) { // Handle the event

Applikationsprogrammerarens jobb I Application.start eller konstruktor i någon subklass till Node: 2. Button button = new Button("Red"); // source 3. ButtonHandler handler = new ButtonHandler( ); 4. button.addeventhandler( ActionEvent.ACTION, handler); // handler // associate Alternativ till 4: 4. button.setonaction(handler); Allmänt: component.setonxxx, ex. canvas.setonmouseclicked( ) Kodexempel: EventHandlerExample1.java

Inre klasser (ej specifikt för class Outer { private int x, y; EventHandler) class Inner { private int x; void foo() { Outer.this.x++; y++; x++; Inner-objekt kan endas skapas av ett Outer-objekt Objekt av den inre klassen har direkt insyn i den yttre klassen, Outer - även privat data och metoder I inre klassen: this refererar till Inner-objektet självt Outer.this refererar till objektet av den yttre klassen

EventHandler som inre klass public class EventHandlerExample2 extends Application { private VBox root; public void start(stage primarystage) { root = new VBox(10); Button redbutton = new Button("Red"); redbutton.setonaction(new ButtonHandler("red")); private class ButtonHandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent event) { root.setstyle(stylestr); // CSS style Kodexempel: EventHandlerExample2.java

EventHandler som anonym och inre klass public class EventHandlerExample3 extends Application { private VBox root; public void start(stage primarystage) { root = new VBox(10); Button redbutton = new Button("Red"); // An anonymous inner class EventHandler buttonhandler = new EventHandler<ActionEvent>() { @Override public void handle(actionevent event) { root.setstyle(stylestr); ; redbutton.setonaction(buttonhandler); Kodexempel: EventHandlerExample3.java

Händelsetyper och källor (ej komplett) Användarinteraktion Händelsetyp Klass som kan registrera motsv. EventHandler Tangent tryckt KeyEvent Node, Scene Mus rörs eller musknapp används MouseEvent Node, Scene Mus släpas MouseDragEvent Node, Scene Komponent rörs TouchEvent Node, Scene Knapp trycks, ENTER i inmatningsfält, menyalternativ väljs, Fönster stängs, visas eller döljs ActionEvent WindowEvent ButtonBase, ComboBoxBase, ContextMenu, MenuItem, TextField Window (Stage är en subklass)

Hierarki för händelsetyper Källa: Oracle: JavaFX Documetation

MouseEvent public void start(stage primarystage) { canvas = new Canvas(300, 300); canvas.setonmouseclicked( new MouseClickHandler()); private class MouseClickHandler implements EventHandler<MouseEvent> { @Override public void handle(mouseevent event) { // Kodeexempel: MouseEventExample.java

KeyEvent public void start(stage primarystage) { KeyHandler keyhandler = new KeyHandler(); root.setonkeypressed(keyhandler); root.setonkeyreleased(keyhandler); root.setonkeytyped(keyhandler); // NB! The component receiving key events must be in focus root.setfocustraversable(true); root.requestfocus(); private class KeyHandler implements EventHandler<KeyEvent> { @Override public void handle(keyevent event) { if (KeyEvent.KEY_TYPED.equals(event.getEventType())) { text.settext(ch); Kodeexempel: KeyEventExample.java, KeyCodeExample.java

WindowEvent stage.setoncloserequest( new EventHandler<WindowEvent>() { ); @Override public void handle(windowevent event) { // E.g. save data before exit Ex. definiera vad som ska ske innan applikationens huvudfönster stängs, via krysset, dvs. innan applikationen avslutas Kodexempel: WindowEventExample.java

Händelsehantering, bakom kulisserna(?)

Menyer MenuBar Menu kan innehålla MenuItem-objekt eller Menu-objekt (sub-meny) MenuItem källa för ActionEvent Lägg till menyraden till root-objektet för Scene root.getchildren.add(menubar);

Menyer Menu filemenu = new Menu("File"); MenuItem exititem = new MenuItem("Exit"); filemenu.getitems().add(exititem); MenuBar menubar = new MenuBar(); menubar.getmenus().addall(filemenu, colormenu); root.getchildren().add(menubar);