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

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

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

INF våren 2017

IN våren 2018 Tirsdag 16. januar

IN våren 2019 Onsdag 16. januar

Gjennomgang av eksamen H99

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

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

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

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

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

UNIVERSITETET I OSLO

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

Program delegate. Lage et nytt prosjekt i Visual Studio

UNIVERSITETET I OSLO

Introduksjon til objektorientert programmering

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

UNIVERSITETET I OSLO

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

Kapittel 8: Programutvikling

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

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

INF Notater. Veronika Heimsbakk 10. juni 2012

Grafisk Brukergrensesnitt

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

LO191D/LC191D Videregående programmering

Argumenter fra kommandolinjen

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

Dagens tema Kapittel 8: Objekter og klasser

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

Grafiske brukergrensesnitt med Swing og AWT

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

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

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

Fra Python til Java, del 2

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

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

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

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

INF Uke 10. Ukesoppgaver oktober 2012

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

UNIVERSITETET I OSLO

Løsningsforslag Test 2

Kapittel 7: Mer om arv

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

UNIVERSITETET I OSLO

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

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

Del 3: Evaluere uttrykk

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

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

UNIVERSITETET I OSLO

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Programmeringsspråket C

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

TOD063 Datastrukturer og algoritmer

INF1000 oppgaver til uke 38 (17 sep 23 sep)

TDT4100 Objektorientert programmering

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

INF1010. Grensesnittet Comparable<T>

Java PRP brukermanual

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

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

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

Løse reelle problemer

INF1000 : Forelesning 4

TDT4100 Objektorientert programmering

På tide med et nytt spill! I dag skal vi lage tre på rad, hvor spillerne etter tur merker ruter med X eller O inntil en av spillerne får tre på rad.

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

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

Dagens tema: Mer av det dere trenger til del 1

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

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

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

HØGSKOLEN I SØR-TRØNDELAG

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

En klasse er noe - en metode gjør noe (! / # <= (! * +!! ",-' %. "- -/ %.!#) )! " 0'%! * *$! "1-)) '' % '. 22!'( 7/ /! * 2 2! "*"% 8"%% 9 - -!

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

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

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

2 Om statiske variable/konstanter og statiske metoder.

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

INF1000: Forelesning 4. Mer om arrayer Metoder

Transkript:

GUI («Graphical User Interface») del 2 Interaksjon med brukeren Hendelsesdrevet programmering Tråder i GUI Se også på Infoskrivet https://www.uio.no/studier/emner/matnat/ ifi/in1010/v18/gui/fx-intro-in1010.pdf Programkoden i https://www.uio.no/studier/emner/ matnat/ifi/in1010/v18/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... 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 Event-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 Event-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) { Application.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.

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 Event-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.