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

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

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

GUI («Graphical User Interface») del 2

GUI («Graphical User Interface») del 2

INF1010. Grensesnittet Comparable<T>

Grafisk Brukergrensesnitt

En kort introduksjon til JavaFX

Kalkulator-leksjonen (nesten ferdig)

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

GUI («Graphical User Interface»)

Enkel app-programmering med JavaFX og FXML

UNIVERSITETET I OSLO

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

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

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

GUI-programmering, del 3 Vinduslyttere Dialogvinduer GUI-komponenten JTable Egne datamodellklasser. En oversikt over kapittel 19 i boka

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

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

Løsningsforslag Test 2

HØGSKOLEN I SØR-TRØNDELAG

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

UNIVERSITETET I OSLO

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

OPPGAVE 5b og 8b Java Kode

GUI («Graphical User Interface»)

INF1000 Prøveeksamen Oppgave 7 og 9

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

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

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

INF1010 Binære søketrær ++

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

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

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

INF1010 MVC i tekstbaserte programmer

INF Seminaroppgaver til uke 3

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

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

INF1010. Stein Michael Storleer (michael) Lenkelister

LO191D/LC191D Videregående programmering

INF Notater. Veronika Heimsbakk 10. juni 2012

INF1010 Arv. Marit Nybakken 2. februar 2004

INF1010 våren januar. Objektorientering i Java

Repetisjon. INF gruppe 13

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

UNIVERSITETET I OSLO

INF1010 våren 2018 tirsdag 23. januar

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Del 3: Evaluere uttrykk

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

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

Program delegate. Lage et nytt prosjekt i Visual Studio

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

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

Eksamen i Internetteknologi Fagkode: ITE1526

TDT4100 Objektorientert programmering

Oppgave 1. Løsningsforslag til eksamensoppgave. ITF20006 Algoritmer og datastrukturer Postorden traversering:

Forelesning inf Java 5

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Forelesning inf Java 5

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

Socket og ServerSocket

Dagens tema INF1010 INF1010 INF1010 INF1010

IN Notat om I/O i Java

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

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

Post-it spørsmål fra timen (Arv og subklasser)

INF Løsning på seminaropppgaver til uke 8

Læringsmål for forelesningen

UNIVERSITETET I OSLO

INF2100. Oppgaver 23. og 24. september 2010

Generiske mekanismer i statisk typede programmeringsspråk

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

Objektorientert design av kode. Refaktorering.

INF Notat om I/O i Java

UNIVERSITETET I OSLO

LC191D/LO191D Videregående programmering mai 2010

TDT4100 Objektorientert programmering

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

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

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

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

Klassen javax.swing.joptionpane

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

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

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

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

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

1. NetBeans IDE: Lage en enkel mobilapplikasjon

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

INF2100. Oppgaver 26. september til 1. oktober 2007

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

Obligatorisk oppgave 4: Lege/Resept

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF1010 våren Arv og subklasser del 1

IN2010: Algoritmer og Datastrukturer Series 2

Transkript:

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

Innhold 1. Ta opp tråden fra sist 2. Input med TextField 3. Anonyme klasser 4. Lytte på alle noder i et grid 5. FileChooser 6. Alert (dialogbokser)

Superklassen til alle JavaFX applikasjonsklasser Livssyklus: Denne klassen er startpunktet for alle JavaFX-applikasjoner. JavaFXs runtime-system utfører disse operasjonene i denne rekkefølgen når Apprlication.launch(...) kalles: 1. Lager et objekt/instans av subklassen til Application 2. kaller init()-metoden 3. Kaller start(javafx.stage.stage)-metoden 4. Venter på at applikasjonen skal avsluttes, noe som skjer når et av følgende inntreffer: Applikasjonen kaller metoden javafx.application.platform.exit() Det siste vinduet er blitt lukket og attributtet implicitexit i Plattform er true 5. Metoden stop() kalles Merk at start-metoden er abstrakt og må defineres () i applikasjonsklassen.

public class ButtonFrame1FX extends Application { public void start(stage hovedscenen) { Button knappp = new Button("Si «hei»"); EventHandler<ActionEvent> knappelytter = new MinLytterKlasse( ) ; knappp.setonaction(knappelytter); FlowPane pane = new FlowPane(); pane.getchildren().addall(knappp); Scene scene = new Scene(pane, 100, 50); hovedscenen.settitle("hovedscene"); hovedscenen.setscene(scene); hovedscenen.show(); public class MinLytterKlasse implements EventHandler<ActionEvent> { public void handle(actionevent event) { System.out.println("Dette blir skrevet når hendelsen inntreffer..");

public class MinGUIApp extends Application { public void start(stage vindu) throws Exception { BorderPane border = new BorderPane(); HBox hbox = nyhbox(); border.settop(hbox); border.setleft(vboxmedtekst()); border.setcenter(mingridpane()); // GridPane border.setright(nyvboxmedlenker()); // VBox border.setbottom(bunnboks()); // HBox Scene scene = new Scene(border, 800, 600); vindu.setscene(scene); vindu.show(); vindu.settitle("eksempel med interaksjon ved knappetrykk"); private HBox nyhbox() { class KnappeLytter implements EventHandler<ActionEvent> { private VBox nyvboxmedlenker() { private VBox vboxmedtekst() { private GridPane mingridpane() { class ByttSmilOgFugl implements EventHandler<ActionEvent> { private HBox bunnboks() { private class Avslutt implements EventHandler<ActionEvent> {

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 MinLytterKlasse implements EventHandler<ActionEvent> { public void handle(actionevent ae) { System.out.println( Skrives når hendelsen inntreffer..");

Input ved hjelp av tekstfelter og lyttende knapp

TextField tekstfelt = new TextField("Skriv noe i dette feltet..."); tekstfelt.setprefsize(300, 30) ; Button levertekst = new Button("Trykk for å lese inn teksten"); levertekst.setprefsize(200, 30); EventHandler<ActionEvent> lesinntekst = new LesTekstfelt(tekstfelt); levertekst.setonaction(lesinntekst); private class LesTekstfelt implements EventHandler<ActionEvent> { TextField tekstfelt = null; LesTekstfelt(TextField tf) { tekstfelt = tf; public void handle(actionevent knapptrykka) { String s = tekstfelt.gettext(); tekstfelt.clear(); System.out.println("Teksten som ble skrevet inn var «" + s + "»");

Anonyme klasser

private HBox bunnboks() { HBox hbox = new HBox();............ Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); EventHandler<ActionEvent> trykkavsluttknapp = new Avslutt(); avslutt.setonaction(trykkavsluttknapp); hbox.getchildren().addall(tekstfelt, levertekst, avslutt); return hbox; class Avslutt implements EventHandler<ActionEvent> { public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit();

Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); class Avslutt implements EventHandler<ActionEvent> { public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); EventHandler<ActionEvent> trykkavsluttknapp = new Avslutt(); avslutt.setonaction(trykkavsluttknapp); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);

Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); class Avslutt implements EventHandler<ActionEvent> { public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); EventHandler<ActionEvent> trykkavsluttknapp = new EventHandler<ActionEvent>( ){ public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); avslutt.setonaction(trykkavsluttknap); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);

Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); EventHandler<ActionEvent> trykkavsluttknapp = new EventHandler<ActionEvent>( ){ public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); avslutt.setonaction(trykkavsluttknap); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);

Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); EventHandler<ActionEvent> trykkavsluttknapp = new EventHandler<ActionEvent>( ){ Anonym klasse public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); avslutt.setonaction(trykkavsluttknap); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);

Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); avslutt.setonaction( new EventHandler<ActionEvent>( ){ ); public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);

Samme som forrige side skrevet om som lambda-funksjon Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); avslutt.setonaction( (avsluttknapptrykka) -> { javafx.application.platform.exit(); ); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);

TextField tekstfelt = new TextField("Skriv noe i dette feltet..."); tekstfelt.setprefsize(300, 30) ; // javafx.scene.control Button levertekst = new Button("Trykk for å lese inn teksten"); levertekst.setprefsize(200, 30); levertekst.setonaction(new EventHandler<ActionEvent>() { public void handle(actionevent knapptrykka) { String s = tekstfelt.gettext(); tekstfelt.clear(); System.out.println("Teksten som ble skrevet inn var «" + s + "»"); ); Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); avslutt.setonaction(new EventHandler<ActionEvent>() { ); public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);

String[][] tekstarray = { {" ", "4", "2", "3", {" ", "2", "1", "4", {"4", " ", " ", " ", {"3", "1", "4", " " ; GridPane rutepanel = new GridPane(); for (int i= 0; i < tekstarray.length; i++) { for (int j = 0; j < tekstarray[i].length; j++) { StackPane s = new StackPane();... Text tekst = new Text(tekstArray[i][j]); tekst.setonmousepressed( new SkiftTekst(tekst) ); s.getchildren().add(tekst); rutepanel.add(s, j, i);

for (int i= 0; i < tekstarray.length; i++) { for (int j = 0; j < tekstarray[i].length; j++) { StackPane s = new StackPane(); Text tekst = new Text(tekstArray[i][j]); class SkiftTekst implements EventHandler<MouseEvent> { Text tekst; SkiftTekst(Text t) {tekst = t; public void handle(mouseevent me) { System.out.println("Klikk i " + me.getscenex()); System.out.println( tekst.tostring() ); System.out.println( me.tostring() ); String nytekst = null; if (tekst.gettext().equals(" ")) nytekst = "0"; else if (tekst.gettext().equals("9")) nytekst = " "; else { Integer i = Integer.parseInt( tekst.gettext() ) + 1 ; nytekst = new String(i.toString()); tekst.settext(nytekst); tekst.setonmousepressed( new SkiftTekst(tekst) ); s.getchildren().add(tekst); rutepanel.add(s, j, i);

Dialogbokser for å velge filer http://docs.oracle.com/javafx/2/ui_controls/file-chooser.htm

Dialogvinduer http://code.makery.ch/blog/javafx-dialogs-official/

The Alert class subclasses the Dialog class, and provides support for a number of pre-built dialog types that can be easily shown to users to prompt for a response. Therefore, for many users, the Alert class is the most suited class for their needs (as opposed to using Dialog directly). Alternatively, users who want to prompt a user for text input or to make a choice from a list of options would be better served by using TextInputDialog and ChoiceDialog, respectively.

public class Dialog01 extends Application { public void start(stage hovedscenen) { Alert alert = new Alert(AlertType.INFORMATION); alert.settitle("dialoginformasjon"); alert.setheadertext("dette er et dialogvindu av type INFORMATION"); alert.setcontenttext("dette er nest siste forelesning i INF1010."); alert.showandwait();

public class Dialog02 extends Application { public void start(stage hovedscenen) { Alert alert = new Alert(AlertType.CONFIRMATION); alert.settitle("dialog for å bekrefte..."); alert.setheadertext("dette er en dialogboks av type AlertType.CONFIRMATION"); alert.setcontenttext("er dette greit for dere?"); Optional<ButtonType> svar = alert.showandwait(); if (svar.get() == ButtonType.OK){ System.out.println("Brukeren svarte ved å trykke på OK-knappen"); else { System.out.println("Brukeren lukka vinduet eller trykka på CANCEL-knappen");