GUI («Graphical User Interface») del 2

Like dokumenter
GUI («Graphical User Interface») del 2

En kort introduksjon til JavaFX

GUI («Graphical User Interface»)

GUI («Graphical User Interface»)

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

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

Kalkulator-leksjonen (nesten ferdig)

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

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

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

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

Gjennomgang av eksamen H99

INF Notater. Veronika Heimsbakk 10. juni 2012

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

UNIVERSITETET I OSLO

IN våren 2018 Tirsdag 16. januar

IN våren 2019 Onsdag 16. januar

INF våren 2017

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; }

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

UNIVERSITETET I OSLO

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

LO191D/LC191D Videregående programmering

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Synkronisering I. Kapittel 6. Tråd A. ferdig. t.varsle() u.vente() Tråd B. ferdig. tid

Oppsummering del 2. Læringsmål Viktigste Java-elementer Eksamen Til sist. Læringsmål Hovedpunkter Tilbakemelding Eksamen. IN1010 uke 17 våren 2019

INF1010 Tråder J. Marit Nybakken Motivasjon. Å lage en tråd

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

Program delegate. Lage et nytt prosjekt i Visual Studio

Introduksjon til objektorientert programmering

Avdeling for ingeniørutdanning Institutt for teknologi

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

UNIVERSITETET I OSLO

Del 3: Evaluere uttrykk

UNIVERSITETET I OSLO

Dagens tema Kapittel 8: Objekter og klasser

INF2440 Prøveeksamen, løsningsforslag, 20 mai Arne Maus PSE, Inst. for informatikk

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

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

Programmeringsspråket C

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

TOD063 Datastrukturer og algoritmer

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

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

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Jentetreff INF1000 Debugging i Java

INF Uke 10. Ukesoppgaver oktober 2012

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

UNIVERSITETET I OSLO

Kapittel 8: Programutvikling

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

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Løse reelle problemer

static int ant_steiner; //antall steiner static int teller2 = 0; //teller for printing til Thread^ murer; //murertråden

Løsningsforslag Test 2

Tilstandsmaskiner med UML og Java

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

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

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

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

Grafisk Brukergrensesnitt

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Fra Python til Java, del 2

Løsningsforslag til eksamen i INF1000 våren 2006

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

Stein Gjessing. Institutt for informatikk. Universitetet i Oslo. Institutt for informatikk

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Innhold. Forord Det første programmet Variabler, tilordninger og uttrykk Innlesing og utskrift...49

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

Kapittel 9: Sortering og søking Kort versjon

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Argumenter fra kommandolinjen

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

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

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

UNIVERSITETET I OSLO

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

TDT4100 Objektorientert programmering

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

UNIVERSITETET I OSLO

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

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Å lese tall fra en fil, klassen Scanner

UNIVERSITETET I OSLO

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Sortering med tråder - Quicksort

Kapittel 7: Mer om arv

UNIVERSITETET I OSLO

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

Side 1 av 11, prosesser, tråder, synkronisering, V. Holmstedt, HiO 2006

INF1010 Sortering. Marit Nybakken 1. mars 2004

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Transkript:

GUI («Graphical User Interface») del 2 Interaksjon med brukeren Hendelsesdrevet programmering Tråder i GUI Et spill basert på klikkbare ruter Se også på Infoskrivet https://www.uio.no/studier/emner/matnat/ ifi/in1010/v19/notater/fx-intro-in1010.pdf Programkoden i https://www.uio.no/studier/emner/ matnat/ifi/in1010/v19/programmer/gui/

Det enkleste eksempelet på brukerinteraksjon import javafx.application.application; import javafx.application.platform; import javafx.stage.stage; import javafx.scene.scene; import javafx.scene.layout.pane; import javafx.scene.control.button; import javafx.event.*; public class Stopp extends Application { class StoppBehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { Platform.exit(); @Override public void start(stage teater) { StoppBehandler stopp = new StoppBehandler(); Button stoppknapp = new Button("Stopp"); stoppknapp.setonaction(stopp); Pane kulisser = new Pane(); kulisser.getchildren().add(stoppknapp); Scene scene = new Scene(kulisser); teater.settitle("klikk for å stoppe"); teater.setscene(scene); teater.show();

Det enkleste eksempelet på brukerinteraksjon Dette er nytt: Vi definerer StoppBehandler som i metoden handle angir håndteringen av trykk. En Button er en trykknapp som brukeren kan trykke på. Metoden setonaction angir hvem som skal ta seg av trykket. Metoden Platform.exit er den beste måte å avslutte et GUI-program på.

Sekvensiell kontra hendelsesdrevet programmering Programmeringsparadigmer Det finnes mange programmeringsparadigmer, for eksempel Imperativ programmering der utførelsen følger programflyten angitt av programmereren. Objektorientert programmering er en undergruppe der operasjonene er knyttet til objekter. Hendelsesdrevet programmering der brukerens handlinger styrer programflyten.

Hva skjer i hendelsesdrevet programmering? Hendelsesdrevet programmering Her ligger programmet passivt og venter på at noe skal skje. Dette noe kan være brukeren trykker på en knapp på skjermen brukeren flytter musen brukeren trykker på en mustast brukeren trykker på en tast på tastaturet brukeren slipper opp en tast brukeren endrer størrelsen på vinduet en alarm utløses... og mye annet.

Hva skjer i hendelsesdrevet programmering? Oppstart Programmet startes i main-tråden. launch(); Det kaller launch(). main-tråden

Hva skjer i hendelsesdrevet programmering? start Oppstart av JavaFX JavaFX kjører metoden start i FX-tråden for å sette opp scenebildet. launch(); main-tråden FX-tråden

Hva skjer i hendelsesdrevet programmering? start? Vente på hendelser Nå ligger FX-tråden og venter på at noe skal skje. launch(); Kø av ActionEvent-er EventHandler-objekter main-tråden FX-tråden

Hva skjer i hendelsesdrevet programmering? Håndtere hendelser start? Hver hendelse som inntreffer, resulterer i et ActionEvent-objekt i køen. launch(); Hendelsesløkken i FX-tråden vil ta ActionEvent-ene etter tur, og den korrekte EventHandler-en vil bli kalt. main-tråden FX-tråden Kø av ActionEvent-er EventHandler-objekter

Hva skjer i hendelsesdrevet programmering? Hvorfor trenger vi en kø av ActionEvent-er? FX-tråden kan bare ta seg av én hendelse av gangen, men noen ganger kan flere hendelser inntreffe omtrent samtidig. Da trenger vi køen for å ta vare på de hendelsene som venter på å bli tatt hånd om.

Et nytt eksempel: et telleverk Eksempel: Et telleverk Dette vinduet inneholder: telleren (en Text) trykknappen Øk teller (en Button) trykknappen Nullstill (en Button) trykknappen Stopp (en Button)

Et nytt eksempel: et telleverk Hvordan bygge opp et GUI-program 1 Finn ut nøyaktig hva programmet skal gjøre. 2 Lag en håndtegning av alle elementene. 3 Skriv kode som genererer elementene og plasserer dem på rett plass. 4 Lag EventHandler-klassene.

Et nytt eksempel: et telleverk Del 1: Import og hovedstruktur import javafx.application.application; import javafx.application.platform; import javafx.stage.stage; import javafx.scene.scene; import javafx.scene.control.button; import javafx.scene.layout.pane; import javafx.scene.text.*; import javafx.event.*; public class Telleverk extends Application { int teller = 0; Text tellersomtext = new Text("0"); public static void main(string[] arg) { launch();

Et nytt eksempel: et telleverk Del 2: Deklarasjon av EventHandler-ne class NulleBehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { teller = 0; tellersomtext.settext("0"); class TelleBehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { teller++; tellersomtext.settext(""+teller); class StoppBehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { Platform.exit();

Et nytt eksempel: et telleverk Del 3: Oppsettet av vinduselementene @Override public void start(stage teater) { tellersomtext.setfont(new Font(25)); tellersomtext.setx(30); tellersomtext.sety(25); Button telleknapp = new Button("Øk teller"); telleknapp.setlayoutx(10); telleknapp.setlayouty(50); TelleBehandler tell = new TelleBehandler(); telleknapp.setonaction(tell); Button nulleknapp = new Button("Nullstill"); nulleknapp.setlayoutx(14); nulleknapp.setlayouty(80); NulleBehandler nulle = new NulleBehandler(); nulleknapp.setonaction(nulle); Button stoppknapp = new Button("Stopp"); stoppknapp.setlayoutx(20); stoppknapp.setlayouty(110); StoppBehandler stopp = new StoppBehandler(); stoppknapp.setonaction(stopp);

Et nytt eksempel: et telleverk Del 4: Avsluttende initiering Pane kulisser = new Pane(); kulisser.setprefsize(90,150); kulisser.getchildren().add(tellersomtext); kulisser.getchildren().add(telleknapp); kulisser.getchildren().add(nulleknapp); kulisser.getchildren().add(stoppknapp); Scene scene = new Scene(kulisser); teater.settitle("teller"); teater.setscene(scene); teater.show();

Noe kan ta for lang tid Advarsel: Ting tar tid I JavaFX finnes det i utgangspunktet kun én tråd som både skal oppdatere vinduet og håndtere alle EventHandler-ne. Det innebærer at mens en EventHandler jobber, er resten av GUI-systemet dødt hvis en EventHandler får en for stor oppgave (for eksempel beregne et sjakktrekk), må det opprettes en egen tråd til det.

Noe kan ta for lang tid Et eksempel på dårlig koding static void ventaktivt(int n) { // Kjør kode som tar omtrent n sekunder. for (int i = 1; i <= n; i++) { long x = 1; for (long j = 1; j <= 250*1000*1000; j++) { x = (3+j)*x % (1000*1000); class NulleBehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { teller = 0; tellersomtext.settext("0"); ventaktivt(3); class TelleBehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { teller++; tellersomtext.settext(""+teller); ventaktivt(3); class StoppBehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { Platform.exit();

En skjermklokke En klokke Vi ønsker å lage en klokke: Klokken skal vise timer, minutter og sekunder. Den skal oppdateres hvert sekund. Den kan stoppes ved å klikke på den.

En skjermklokke Hva bør vi tenke på? Vi får klokkeslettet fra datamaskinen. Oppdateringen besørges av en egen tråd som går i løkke: den sover ett sekund og oppdaterer så klokkeslettet. Selve klokken må være en button slik at vi kan klikke på den.

En skjermklokke Siden oppdateringen gjøres utenfor FX-tråden, kan vi ikke kalle settext direkte. Vi må i stedet legge en hendelse i køen; dette gjøres med et kall på launch(); start Kø av ActionEvent-er EventHandler-objekter Platform.runLater(Runnable r) main-tråden FX-tråden SekundTeller-tråden

En skjermklokke Del 1: Import og hovedstruktur import javafx.application.application; import javafx.application.platform; import javafx.stage.stage; import javafx.scene.scene; import javafx.scene.control.button; import javafx.scene.layout.pane; import javafx.scene.text.font; import javafx.event.*; import java.time.localtime; public class Klokke extends Application { Button klokken = new Button(naa()); boolean slutt = false; public static void main(string[] args) { launch(args); private static String naa() { // Hva er klokken nå? Svaret er på formen "12:34:56". LocalTime t = LocalTime.now(); return String.format("%02d:%02d:%02d", t.gethour(), t.getminute(), t.getsecond());

En skjermklokke Del 2: EventHandler-e class StoppBehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { slutt = true; Platform.exit();

En skjermklokke Del 3: Sekundtellertråden class SekundTeller extends Thread { // En egen tråd som oppdaterer klokkeslettet hvert sekund. @Override public void run() { while (! slutt) { try { sleep(1000); catch (InterruptedException e) { Platform.exit(); Platform.runLater(new VisTid()); class VisTid implements Runnable { @Override public void run() { klokken.settext(naa());

En skjermklokke Del 4: Resten av initieringen @Override public void start(stage teater) { klokken.setfont(new Font(100)); klokken.setonaction(new StoppBehandler()); Pane kulisser = new Pane(); kulisser.getchildren().add(klokken); Scene scene = new Scene(kulisser); teater.settitle("klokken er"); teater.setscene(scene); teater.show(); new SekundTeller().start();

Til sist: en GUI-versjon av Tripp-trapp-tresko Tripp-trapp-tresko med GUI I vår løsning skal vi ha dette: Et vindu med et spillebrett på 3 3 ruter et tekst med info til brukeren en stoppknapp Hver rute på 3 3-brettet skal være klikkbar. Ved hvert klikk skal programmet 1 sjekke om trekket er lovlig 2 vise brukerens trekk 3 sjekke om brukeren har vunnet 4 beregne og vise maskinens trekk 5 sjekke om maskinen har vunnet

Til sist: en GUI-versjon av Tripp-trapp-tresko Definisjon av de klikkbare rutene Vi lager en egen subklasse Rute fordi vi ønsker å lagre et merke i hver rute. De lovlige verdiene skal være: når ruten er ledig X når maskinen har valgt ruten O når spilleren har valgt ruten. class Rute extends Button { char merke = ; Rute() { super(" "); setfont(new Font(50)); setprefsize(120, 120); void settmerke(char c) { settext(""+c); merke = c;

Til sist: en GUI-versjon av Tripp-trapp-tresko Sett opp rutenettet brett = new Rute[9+1]; Klikkbehandler klikk = new Klikkbehandler(); for (int i = 1; i <= 9; i++) { brett[i] = new Rute(); brett[i].setonaction(klikk); GridPane rutenett = new GridPane(); rutenett.setgridlinesvisible(true); rutenett.add(brett[1], 0, 0); rutenett.add(brett[2], 1, 0); rutenett.add(brett[3], 2, 0); rutenett.add(brett[4], 0, 1); rutenett.add(brett[5], 1, 1); rutenett.add(brett[6], 2, 1); rutenett.add(brett[7], 0, 2); rutenett.add(brett[8], 1, 2); rutenett.add(brett[9], 2, 2); rutenett.setlayoutx(10); rutenett.setlayouty(10);

Til sist: en GUI-versjon av Tripp-trapp-tresko Håndtering av klikk i en rute Metoden getsource gir oss hvilken rute det ble klikket i. class Klikkbehandler implements EventHandler<ActionEvent> { @Override public void handle(actionevent e) { if (! ferdig) spillo((rute)e.getsource());

Til sist: en GUI-versjon av Tripp-trapp-tresko Håndter brukerens valg void spillo(rute r) { if (r.merke!= ) { statusinfo.settext("ruten er opptatt; velg en annen"); return; else { statusinfo.settext("velg en rute"); r.settmerke( O ); if (harvunnet( O )) utropvinner( O ); if (! ferdig) spillx();

Til sist: en GUI-versjon av Tripp-trapp-tresko La datamaskinen velge sitt neste trekk Datamaskinen gjør sitt neste trekk helt tilfeldig. Random tilfeldig = new Random(); void spillx() { int p; do { p = tilfeldig.nextint(9)+1; while (brett[p].merke!= ); brett[p].settmerke( X ); if (harvunnet( X )) utropvinner( X ); else if (eruavgjort()) utropuavgjort();

Litt mer om trpdene De to trådene De to trådene kan jobbe i fred for hverandre. start? De kan kommunisere gjennom felles variable. Men: main-tråden bør ikke kalle GUI-metoder; det går ikke alltid bra! launch(); Kø av ActionEvent-er I stedet kan main-tråden legge inn nye Event-er i køen ved å kalle Platform.runLater(r) der r implementerer Runnable (se eksemplet Klokke.java). main-tråden FX-tråden EventHandler-objekter

Noen gode råd til sist Noen gode råd Før du prøver å lage ditt første GUI-program: Hent et program fra IN1010-sidene. «Lek» litt med programmet. Brøv å endre noe eller legge noe til, og se hva som skjer.