GUI. Grafisk brukergrensesni0 i Java med JavaFX. INF1010 Stein Michael Storleer

Like dokumenter
GUI 1. Grafisk brukergrensesni1 i Java med JavaFX. INF1010 Stein Michael Storleer

GUI 3 JavaFX. Mer interaksjon Hvordan gi input :l programmet. INF1010 Stein Michael Storleer

GUI («Graphical User Interface») del 2

GUI («Graphical User Interface») del 2

GUI («Graphical User Interface»)

GUI («Graphical User Interface»)

En kort introduksjon til JavaFX

Logo med FXML. Introduksjon. Skrevet av: Hallvard Trætteberg

Steg 1: Opprette app-pakke, app-klasse og FXML-fil

UNIVERSITETET I OSLO

Steg 1: Sette opp Java-prosjekt, og lage app-mappe og app-klasse

INF1010 Grafisk brukergrensesni3 (GUI) med Swing/awt. del 1

Kalkulator-leksjonen (nesten ferdig)

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Steg 1: Sette opp Java-prosjekt, og lage appmappe

Grafisk Brukergrensesnitt

Mål med kurset. Java i INF Dagens tema. GUI med Swing. Dokumentasjon

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

INF1010. Grensesnittet Comparable<T>

INF1010 våren 2018 tirsdag 23. januar

INF Notater. Veronika Heimsbakk 10. juni 2012

Sortering med tråder - Quicksort

Repitisjonskurs. Arv, Subklasser og Grensesnitt

UNIVERSITETET I OSLO

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Gjennomgang av eksamen H99

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Grafiske brukergrensesnitt med Swing og AWT

import javax.swing.*; import java.awt.*;

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Utplukk av Java (GUI, kode-konvensjon, Introduksjon til første Java øving. polymorfisme, classpath, javadoc) Java og signalbehandling UNIVERSITETET

Enkel app-programmering med JavaFX og FXML

UNIVERSITETET I OSLO

Tråder Repetisjon. 9. og 13. mai Tråder

INF 1010, vår 2005 Løsningsforslag uke 11

UNIVERSITETET I OSLO

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Tråder Repetisjon. 9. og 13. mai Tråder

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

Introduksjon til Eclipse

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Kapittel 7: Mer om arv

UNIVERSITETET I OSLO

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

INF1010 våren Arv og subklasser del 1

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Java i INF 2310 Dagens tema

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Eksamen Objektorientert Programmering 2012

Utplukk av Java (GUI, kode-konvensjon, Java og bildebehandling i J2SE. BufferedImage m/venner. polymorfisme, classpath, javadoc) UNIVERSITETET I OSLO

La oss begynne med en repetisjon av hva som skjer når du kjører Javaprogrammet

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser - del 2

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

INF Løsning på seminaropppgaver til uke 8

IN2010: Algoritmer og Datastrukturer Series 2

Velkommen til. INF våren 2016

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

I et Java-program må programmøren lage og starte hver tråd som programmet bruker. Er dette korrekt? Velg ett alternativ

INF Våren Li' repe$sjon om Tråder og GUI. Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo. Ins$tu' for informa$kk

Sudokubrettet Et sudokubrett består av n n ruter. Vi bruker følgende begreper i oppgaven:

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1010 våren Arv og subklasser del 1

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

INF1010 våren Arv og subklasser - del 2

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

Qt Jambi E t R ammeverks His torie

~ta11 oppgaver: 4. Nle skriftlige hjelpemidler-både trykte og håndskrevne, er tillatt

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

LO191D/LC191D Videregående programmering

INF1010 Binære søketrær ++

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

INF2100. Oppgaver 26. september til 1. oktober 2007

Emnenavn: Objektorientert programmering. Faglærer: Lars Emil Knudsen

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

1. NetBeans IDE: Lage en enkel mobilapplikasjon

Løsningsforslag til eksamen i INF1000 våren 2006

Java RMI. Introduksjon. Markus Foss Hans-Gunnar Vold

INF1010 våren Grensesnitt (interface)

HØGSKOLEN I SØR-TRØNDELAG

Eksempel 1 Eksempel 2 Dramatisering. INF1000 uke 3. Sundvollen 7. september 2015 Dag Langmyhr. INF1000 Sundvollen

Klasser, objekter, pekere og UML. INF gruppe 13

INF1010 våren Arv og subklasser del 1 (pluss litt I/O og unntaksbehandling)

Eksamen. Objektorientert Programmering IGR 1372

Transkript:

GUI Grafisk brukergrensesni0 i Java med JavaFX INF1010 Stein Michael Storleer

GUI-rammeverk i java Awt Swing JavaFX

awt

JavaFX er et svært rammeverk med mange, mange klasser Vi kan bare dekke en liten flik og må gå fort over detaljer Konsentrerer oss om å forstå noen basale begreper En helt annen måte å programmere på Noen viknge snkkord: Scenegraf (Scene graph) Node (grennode og løvnode) Beholdere Scener Paneler Stage

Scenegraf (Scene graph) Node (grennode og løvnode) Beholdere Scener Paneler Stage Når du kan forklare disse begrepene og sammenhengen mellom dem, har du fostå7 mye!

import javafx.application.application; import javafx.stage.stage; import javafx.scene.layout.pane; import javafx.scene.scene; public class Eks02 extends Application { @Override public void start(stage vindu) throws Exception { Pane lerret = new Pane(); Scene scene = new Scene(lerret, 900, 700); vindu.setscene(scene); vindu.show(); vindu.settitle("et vindu med et tomt panel (Pane)"); public static void main(string[] a) { launch(a);

1. Lag en klasse som er subklasse Nl javafx.applicanon.applicanon 2. Redefiner (override) metoden public void start(stage vindu) i denne subklassen 3. Lag et objekt av klassen javafx.scene.layout.pane 4. Lag et objekt av klassen javafx.scene.scene med Pane-objektet som parameter Nl konstr. 5. Se0 Scene-objektet inn i vindusobjektet (type Stage) med kallet vindu.setscene(scene); 6. Gjør vinduet synlig med kallet vindu.show(); public class Eks02 extends Application { @Override public void start(stage vindu) throws Exception { Pane lerret = new Pane(); Scene scene = new Scene(lerret, 900, 700); vindu.setscene(scene); vindu.show(); vindu.settitle("et tomt 900 x 700-vindu");

En tekst

public class BareKnapp extends Application { @Override public void start(stage vindu) throws Exception { Pane lerret = new Pane(); Scene scene = new Scene(lerret, 400, 300); vindu.setscene(scene); vindu.show(); vindu.settitle("hovedscene"); Button knapp = new Button("Si «hei»"); lerret.getchildren().add(knapp); class MinLytterKlasse implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { System.out.println("Noen trykka på meg med musknappen!"); knapp.setonaction( new MinLytterKlasse() ); // setonaction skal ha en parameter av type EventHandler<ActionEvent> public static void main(string[] a) { launch(a);

Si «hei» Dette objektet synes på skjermen (som en knapp) public void start (Stage hovedscene) Button Button knapp = new Button("Si «hei»"); knapp Metoden start(stage..) i applikasjonsklassen

Si «hei» Dette objektet synes på skjermen (som en knapp) Button Button knapp = new Button("Si «hei»"); knapp System.out.println( Skrives når hendelsen inntreffer..");

Si «hei» Dette objektet synes på skjermen (som en knapp) Button Button knapp = new Button("Si «hei»"); knapp public void handle(actionevent ae) { System.out.println( Skrives når hendelsen inntreffer..");

Si «hei» Dette objektet synes på skjermen (som en knapp) Button Button knapp = new Button("Si «hei»"); knapp public class MinLytterKlasse implements EventHandler<ActionEvent> { @Override public void handle(actionevent ae) { System.out.println( Skrives når hendelsen inntreffer..");

Si «hei» Dette objektet synes på skjermen (som en knapp) Button EventHandler<ActionEvent> knapp knappelytter Button knapp = new Button("Si «hei»"); EventHandler<ActionEvent> knappelytter = new MinLytterKlasse( ) ; handle(actionevent ae) Kode for det som skal skje når hendelsen forekommer Et objekt av en klasse som implementerer EventHandler<ActionEvent> public class MinLy0erKlasse implements EventHandler<AcNonEvent> { @Override public void handle(acnonevent ae) { System.out.println( Skrives når hendelsen inntreffer..");

Si «hei» setonaction(eventhandler<actionevent>) Dette objektet synes på skjermen (som en knapp) Button EventHandler<ActionEvent> knapp knappelytter Button knapp = new Button("Si «hei»"); EventHandler<ActionEvent> knappelytter = new MinLytterKlasse( ) ; handle(actionevent ae) Kode for det som skal skje når hendelsen forekommer Et objekt av en klasse som implementerer EventHandler<ActionEvent> public class MinLy0erKlasse implements EventHandler<AcNonEvent> { @Override public void handle(acnonevent ae) { System.out.println( Skrives når hendelsen inntreffer..");

Si «hei» setonaction(eventhandler<actionevent>) Dette objektet synes på skjermen (som en knapp) Button EventHandler<ActionEvent> knapp knappelytter Button knapp = new Button("Si «hei»"); EventHandler<ActionEvent> knappelytter = new MinLytterKlasse( ) ; knapp.setonaction(knappelytter); handle(actionevent ae) Kode for det som skal skje når hendelsen forekommer Et objekt av en klasse som implementerer EventHandler<ActionEvent> public class MinLy0erKlasse implements EventHandler<AcNonEvent> { @Override public void handle(acnonevent ae) { System.out.println( Skrives når hendelsen inntreffer..");

Si «hei» setonaction(eventhandler<actionevent>) Dette objektet synes på skjermen (som en knapp) EventHandler<ActionEvent> Button EventHandler<ActionEvent> knapp knappelytter Button knapp = new Button("Si «hei»"); EventHandler<ActionEvent> knappelytter = new MinLytterKlasse( ) ; knapp.setonaction(knappelytter); handle(actionevent ae) Kode for det som skal skje når hendelsen forekommer Et objekt av en klasse som implementerer EventHandler<ActionEvent> public class MinLy0erKlasse implements EventHandler<AcNonEvent> { @Override public void handle(acnonevent ae) { System.out.println( Skrives når hendelsen inntreffer..");

En tekst

En tekst

public class UtenLayOut extends Application { @Override public void start(stage stage) { Group root = new Group(); Scene scene = new Scene(root, 500, 500, Color.GREEN); Rectangle r = new Rectangle(25,25,250,250); r.setfill(color.red); root.getchildren().add(r); stage.settitle("javafx scenegraf demo uten layout"); stage.setscene(scene); stage.show(); public static void main(string[] args) { launch(args);

HBox Vbox StackPane GridPane TilePane BorderPane FlowPane Pane.

public class BorderP extends Application { @Override public void start(stage vindu) throws Exception { BorderPane rot = new BorderPane(); // Rota til scenegrafen // Legg inn et tekstelement i hvert område av skjermen rot.settop(new Text("top")); rot.setbottom(new Text("bottom")); rot.setleft(new Text("left")); rot.setright(new Text("right")); rot.setcenter(new Text("center")); Scene scene = new Scene(rot, 400, 700); vindu.setscene(scene); vindu.show(); vindu.settitle("et BorderPane-vindu med tekstelementer"); public static void main(string[] a) { launch(a);

3 nodetyper: rotnoder grennoder eller beholdernoder løvnoder eller endenoder Eksempler på konkrete klasser av de forskjellige nodetypene, et konkret scenetre eller scenegraf (scene graph) Bildene er hentet fra Oracles ne7sider

Object

Object Node

Object Node Parent

Object Node Parent Region

Object Node Parent Region Pane

Object Node Parent Region Pane GridPane Et objekt av GridPane er en grennode (Branch node) som kan inneholde andre noder. Grennoder og løvnoder.

Object Node Shape Text Et objekt av Text er en løvnode (Leaf node) som ikke kan inneholde andre noder.

Object Object Node Node Parent Shape Region Text Pane GridPane Grennoder (Branch nodes) er objekter av klasser som er subklasser Nl Parent Løvnoder (Leaf nodes) har ikke Parent som superklasse Rotnoden må være en grennode, dvs være (av en) subklasse Nl Parent

Konstruktørene Nl Scene

Noen av metodene Nl BorderPane, som vi kommer Nl å bruke i eksemplene

public class Eks04 extends Application { @Override public void start(stage vindu) throws Exception { BorderPane border = new BorderPane(); HBox hbox = nyhbox(); border.settop(hbox); border.setleft(vboxmedtekst()); border.setcenter(mingridpane()); Scene scene = new Scene(border, 400, 700); vindu.setscene(scene); vindu.show(); vindu.settitle("eksempel på bruk av Border- og GridPane, HBox og Vbox"); vindu.setscene(scene); public static void main(string[] a) { launch(a); private HBox nyhbox() { private Vbox vboxmedtekst() { private GridPane mingridpane() {...

public void start(stage vindu) throws Exception { BorderPane border = new BorderPane(); HBox hbox = nyhbox(); border.settop(nyhbox); border.setleft(vboxmedtekst()); Scene scene = new Scene(border, 400, 700); vindu.setscene(scene); vindu.show();

Minner om trinnene:

Minner om trinnene: 1. Oppre0er en rotnode/grennode (subklasse av Parent)

Minner om trinnene: 1. Oppre0er en rotnode/grennode (subklasse av Parent) 2. Bygger opp et tre fra denne bestående av grennoder (beholdere) og løvnoder (enkeltelementer)

Minner om trinnene: 1. Oppre0er en rotnode/grennode (subklasse av Parent) 2. Bygger opp et tre fra denne bestående av grennoder (beholdere) og løvnoder (enkeltelementer) 3. Legger scenegrafen/rotnoden Nl treet inn i et sceneobjekt med konstruktøren Nl sceneobjektet

Minner om trinnene: 1. Oppre0er en rotnode/grennode (subklasse av Parent) 2. Bygger opp et tre fra denne bestående av grennoder (beholdere) og løvnoder (enkeltelementer) 3. Legger scenegrafen/rotnoden Nl treet inn i et sceneobjekt med konstruktøren Nl sceneobjektet 4. Legger sceneobjektet inn i vindusramma med metoden Stage.setScene()

Minner om trinnene: 1. Oppre0er en rotnode/grennode (subklasse av Parent) 2. Bygger opp et tre fra denne bestående av grennoder (beholdere) og løvnoder (enkeltelementer) 3. Legger scenegrafen/rotnoden Nl treet inn i et sceneobjekt med konstruktøren Nl sceneobjektet 4. Legger sceneobjektet inn i vindusramma med metoden Stage.setScene() public void start(stage vindu) throws Exception { BorderPane border = new BorderPane(); border.settop( nyhbox() ); border.setleft( vboxmedtekst() ); Scene scene = new Scene(border, 400, 700); vindu.setscene(scene); vindu.show();

private HBox nyhbox() { HBox hbox = new HBox(); hbox.setpadding(new Insets(15, 12, 15, 12)); // t, r b, l hbox.setspacing(10); // Avstand mellom nodene hbox.setstyle("-fx-background-color: #336699;"); Button knapp1 = new Button("Forelest"); knapp1.setprefsize(100, 20); Button knapp2 = new Button("Gjenstår"); knapp2.setprefsize(100, 20); Button knapp3 = new Button("Trixoppgaver"); knapp3.setprefsize(130, 20); Button knapp4 = new Button("Innleveringsoppgaver"); knapp4.setprefsize(200, 20); hbox.getchildren().addall(knapp1, knapp2, knapp3, knapp4); return hbox;

private HBox nyhbox() { HBox hbox = new HBox(); hbox.setpadding(new Insets(15, 12, 15, 12)); // t, r b, l hbox.setspacing(10); // Avstand mellom nodene hbox.setstyle("-fx-background-color: #336699;"); Button knapp1 = new Button("Forelest"); knapp1.setprefsize(100, 20); Button knapp2 = new Button("Gjenstår"); knapp2.setprefsize(100, 20); Button knapp3 = new Button("Trixoppgaver"); knapp3.setprefsize(130, 20); Button knapp4 = new Button("Innleveringsoppgaver"); knapp4.setprefsize(200, 20); hbox.getchildren().addall(knapp1, knapp2, knapp3, knapp4); return hbox;

public class Eks04 extends Application { @Override public void start(stage vindu) throws Exception { BorderPane border = new BorderPane(); HBox hbox = nyhbox(); border.settop(hbox); border.setleft(vboxmedtekst()); border.setcenter(mingridpane()); Scene scene = new Scene(border, 400, 700); vindu.setscene(scene); vindu.show(); vindu.settitle("eksempel på bruk av Border- og GridPane, HBox og Vbox"); vindu.setscene(scene); public static void main(string[] a) { launch(a); private HBox nyhbox() { private Vbox vboxmedtekst() { private GridPane mingridpane() {...

private VBox vboxmedtekst() { VBox vbox = new VBox(); vbox.setpadding(new Insets(10)); // Setter alle sider til 10 vbox.setspacing(8); // Avstand mellom nodene (elementene) Text title = new Text( Hva er JavaFX?"); title.setfont(font.font("arial", FontWeight.BOLD, 14)); vbox.getchildren().add(title); Text t = new Text("JavaFX is a software platform"); vbox.getchildren().add(t); t = new Text("for creating and delivering desktop"); vbox.getchildren().add(t); t = new Text("applications, as well as rich internet"); vbox.getchildren().add(t); t = new Text("applications (RIAs) that can run"); vbox.getchildren().add(t); t = new Text("across a wide variety of devices."); vbox.getchildren().add(t); t = new Text("JavaFX is intended to replace"); vbox.getchildren().add(t); t = new Text("Swing as the standard GUI library"); vbox.getchildren().add(t); t = new Text("for Java SE, but both will be included"); vbox.getchildren().add(t); t = new Text("for the foreseeable future."); vbox.getchildren().add(t); return vbox;

private VBox vboxmedtekst() { VBox vbox = new VBox(); vbox.setpadding(new Insets(10)); // Setter alle sider til 10 vbox.setspacing(8); // Avstand mellom nodene (elementene) Text title = new Text("INF1010 temaer"); title.setfont(font.font("arial", FontWeight.BOLD, 14)); vbox.getchildren().add(title); Text t = new Text("JavaFX is a software platform"); vbox.getchildren().add(t); t = new Text("for creating and delivering desktop"); vbox.getchildren().add(t); t = new Text("applications, as well as rich internet"); vbox.getchildren().add(t); t = new Text("applications (RIAs) that can run"); vbox.getchildren().add(t); t = new Text("across a wide variety of devices."); vbox.getchildren().add(t); t = new Text("JavaFX is intended to replace"); vbox.getchildren().add(t); t = new Text("Swing as the standard GUI library"); vbox.getchildren().add(t); t = new Text("for Java SE, but both will be included"); vbox.getchildren().add(t); t = new Text("for the foreseeable future."); vbox.getchildren().add(t); return vbox;

public class Eks04 extends Application { @Override public void start(stage vindu) throws Exception { BorderPane border = new BorderPane(); HBox hbox = nyhbox(); border.settop(hbox); border.setleft(vboxmedtekst()); border.setcenter(mingridpane()); Scene scene = new Scene(border, 400, 700); vindu.setscene(scene); vindu.show(); vindu.settitle("eksempel på bruk av Border- og GridPane, HBox og Vbox"); vindu.setscene(scene); public static void main(string[] a) { launch(a); private HBox nyhbox() { private Vbox vboxmedtekst() { private GridPane mingridpane() {...

public class Eks04 extends Application { @Override public void start(stage vindu) throws Exception { BorderPane border = new BorderPane(); HBox hbox = nyhbox(); border.settop(hbox); border.setleft(vboxmedtekst()); border.setcenter(mingridpane()); Scene scene = new Scene(border, 400, 700); vindu.setscene(scene); vindu.show(); vindu.settitle("eksempel på bruk av Border- og GridPane, HBox og Vbox"); vindu.setscene(scene); public static void main(string[] a) { launch(a); private HBox nyhbox() { private Vbox vboxmedtekst() { private GridPane mingridpane() {...