GUI («Graphical User Interface»)

Like dokumenter
GUI («Graphical User Interface»)

GUI («Graphical User Interface») del 2

En kort introduksjon til JavaFX

GUI («Graphical User Interface») del 2

Fra Python til Java, del 2

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

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

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

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

Kalkulator-leksjonen (nesten ferdig)

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

Kapittel 8: Programutvikling

UNIVERSITETET I OSLO

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 Grafisk brukergrensesni3 (GUI) med Swing/awt. del 1

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

Introduksjon til Eclipse

Grafiske brukergrensesnitt med Swing og AWT

INF Løsning på seminaropppgaver til uke 8

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

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

Java PRP brukermanual

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

Inf109 Programmering for realister Uke 5. I denne leksjonen skal vi se på hvordan vi kan lage våre egne vinduer og hvordan vi bruker disse.

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Jentetreff INF1000 Debugging i Java

Qt Jambi E t R ammeverks His torie

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

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

Forelesning inf Java 1

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

TOD063 Datastrukturer og algoritmer

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

Enkel lesing og skriving i Java

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

IN Notat om I/O i Java

INF Notat om I/O i Java

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

Operativsystemer og grensesnitt

UNIVERSITETET I OSLO

EKSAMEN OBJEKTORIENTERT PROGRAMMERING Alle trykte og skrevne. Java API dokumentasjon er tilgjengelig lokalt på hver maskin.

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

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

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

Introduksjon til objektorientert programmering

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

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

JSP - 2. Fra sist. Hvordan fungerer web? Tjenerside script HTML. Installasjon av Web-tjener Et enkelt JSP-script. Ønsker dynamiske nettsider:

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

Nyttige Linux-kommandoer. Hvordan du kan jobbe mer effektivt Dag Langmyhr

Dagens tema Kapittel 8: Objekter og klasser

INF1000: Forelesning 7

INF Uke 10. Ukesoppgaver oktober 2012

Argumenter fra kommandolinjen

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

UNIVERSITETET I OSLO

Seminaroppgaver IN1010, uke 2

Komme igang med App Inventor Introduksjon App Inventor PDF

1. NetBeans IDE: Lage en enkel mobilapplikasjon

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

EKSAMEN 6109 OBJEKTORIENTERT PROGRAMMERING 5609 OBJEKTORIENTERT PROGRAMMERING

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

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

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

INF1000: Forelesning 6. Klasser og objekter del 1

Enkel app-programmering med JavaFX og FXML

Programmeringsspråket C

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

Eksamen. Objektorientert Programmering IGR 1372

INF1000: Forelesning 7. Konstruktører Static

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

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

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Leksjon 7. Filer og unntak

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

1 t:n'v'\ekode LO325E. Alle ~vne og trykte. GOd'"j(jent kalkulator

Mer objektorientert programmering

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

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

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Enkle generiske klasser i Java

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

Transkript:

GUI («Graphical User Interface») Om GUI JavaFX Se også på Infoskrivet https://www.uio.no/studier/emner/matnat/ ifi/in1010/v19/notater/fx-intro-in1010.pdf Programkoden til eksemplene i https://www.uio.no/studier/emner/matnat/ifi/in1010/ v19/programmer/gui/ Dokumentasjon av JavaFX i https://docs.oracle.com/javase/8/javafx/api/toc.htm

Hvorfor trenger vi GUI? Tripp-trapp-tresko med og uten GUI 1 2 3 4 5 6 7 8 9 $ java TTT1 X spiller 8 Hva spiller O? 5 O spiller 5 X spiller 1 Hva spiller O? 3 O spiller 3 X spiller 2 Hva spiller O? 7 O spiller 7 Vinneren er O! $ java TTT2 X Hva spiller O? 5 X O X Hva spiller O? 8 : Hva spiller O? 2 Vinneren er O! X O O X O X

Positive og negative sider ved GUI Fordeler med GUI Mer intuitivt å bruke Færre muligheter for brukerfeil Visuelt mer tiltalende Ulemper Mer komplisert å programmere Mange ulike GUI-biblioteker å velge blant Svært få biblioteker fungerer for både Linux, Mac og Windows.

En norsk verdenssuksess Historien om Qt Opprinnelig laget av det norske firmaet Trolltech i 1994. Hovedideen var at programmer skrevet i C++ kunne linkes med et Qt-bibliotek og så kjøre på ulike systemer. Sannsynligvis det mest brukte generelle vindusbiblioteket i 1990- og 2000-årene. Solgt til Nokia i 2008 (og siden til Digia og The Qt Company). Finnes i både kommersiell og åpen kildekode-versjoner. Brukes i dag i Google Earth, Mathematica, Tesla-biler,...

Hvorfor hører GUI hjemme i IN1010? Hvorfor GUI i IN1010? Allmennkunnskap for programmerere Et godt eksempel på bruk av OO Viser en ny programmeringstankegang: Hendelsesorientert programmering (neste uke) Et godt eksempel på bruk av parallellisering og tråder (neste uke)

Historien om Java og GUI Java og GUI Java har alltid hatt som mål at programmene skal kunne kjøres uendret på alle platformer. Derimot skal utseendet tilpasses operativsystemets «standard». AWT («Abstract Window Toolkit») fra 1995: et ganske enkelt grensesnitt mot OSets vindussystem Swing fra 2007: et mer avansert og generelt system bygget oppå AWT JavaFX fra 2012: et enda mer komplett og velstrukturert system Fra og med 2018: JavaFX ikke lenger en del av standard Java men et frittstående produkt

Hvordan kan jeg få kjørt mine programmer med JavaFX? Kjøring Grafiske programmer trenger mer støtte ved kjøring fra systemet enn våre tidligere tekstorienterte programmer. Ifis Linux-maskiner Alt skal fungere helt fint. Ifis Windows-maskiner JavaFX fungerer bra på noen Windows-maskiner, men ikke på alle. Ved problemer, start X-Win32 og logg deg inn på en Linux-maskin (f eks login.ifi.uio.no); se https: //termvakt.uio.no/fjerninnlogging#xterm_via_x-win32.

Hvordan kan jeg få kjørt mine programmer med JavaFX? Kjøring på privat maskin Det beste rådet er: Installer Java 8. Da får du automatisk med JavaFX. Andre muligheter (om du har en nyere Java) Fra Linux: ssh -Y login.ifi.uio.no Fra Mac: Installer XQuartz fra https://www.xquartz.org/ Fra Windows: Kjør RemoteDesktop Connection til win.uio.no og så X-Win32 til login.ifi.uio.no Du kan installere JavaFX som egen pakke fra https://www.oracle.com/technetwork/java/javafx/ install-javafx-sdk-1-2-139156.html (men mange har hatt problemer).

Hvordan lager vi et GUI-program? Teatermetaforen De som laget JavaFX, tenkte seg at det en bruker ser i et GUI-vindu, minner mye om det man ser på teater når teppet går opp. Teater Scene Kulisser class Stage class Scene class Pane

Hvordan lager vi et GUI-program? Teatret Et teater settes opp på denne måten: import javafx.application.application; import javafx.stage.stage; public class Xxx extends Application { @Override public void start(stage teater) { // Sett opp scene og kulisser teater.settitle("overskrift"); // teater.setscene(scene); teater.show(); public static void main(string[] args) { launch(args);

Hvordan lager vi et GUI-program? Selv om det ikke er ferdig, kan programmet kjøres: $ javac Xxx.java $ java Xxx

Hvordan lager vi et GUI-program? Alt med JavaFX ligger i biblioteket og vi må importere klassene vi trenger. Alle JavaFX-programmer må være subklasser av Application. main må kalle launch for å starte JavaFX. Hovedklassen må definere en start som setter opp det hele; parameteren angir hovedvinduet («teateret»). settitle angir vinduets tittel. show angir at teppet skal gå opp. import javafx.application.application; import javafx.stage.stage; public class Xxx extends Application { @Override public void start(stage teater) { // Sett opp scene og kulisser teater.settitle("overskrift"); // teater.setscene(scene); teater.show(); public static void main(string[] args) { launch(args);

Hvordan lager vi et GUI-program? Scener og kulisser Vi må også lage en scene og en (foreløbig tom) samling kulisser: import javafx.application.application; import javafx.scene.layout.pane; import javafx.scene.scene; import javafx.stage.stage; public class Xxx2 extends Application { @Override public void start(stage teater) { // Sett opp scene og kulisser Pane kulisser = new Pane(); Scene scene = new Scene(kulisser); teater.settitle("overskrift"); teater.setscene(scene); teater.show(); public static void main(string[] args) { launch(args);

Hvordan lager vi et GUI-program? Ulike typer kulisser Det finnes mengder av ting vi kan bruke som kulisser; vi skal bruke: tekst (class Text) firkanter (class Rectangle) sirkler (class Circle) linjer (class Line) polygoner (class Polygon)

Det kjente hallo-programmet Et eksempel: Hallo-programmet import javafx.application.application; import javafx.stage.stage; import javafx.scene.scene; import javafx.scene.layout.pane; import javafx.scene.text.font; import javafx.scene.text.text; public class Hallo extends Application { @Override public void start(stage teater) { Text hilsen = new Text("Hallo, alle sammen!"); hilsen.sety(40); hilsen.setfont(new Font(40)); Pane kulisser = new Pane(); kulisser.getchildren().add(hilsen); Scene scene = new Scene(kulisser); teater.settitle("velkommen til Java FX"); teater.setscene(scene); teater.show(); public static void main(string[] args) { launch(args);

Det kjente hallo-programmet Vi må importere de klassene vi trenger opprette teksten: Text hilsen = new Text("Hallo, alle sammen!"); Vi kan tilpasse elementene ved for eksempel å endre fontstørrelsen: hilsen.setfont(new Font(40)); inkludere tekstelementet blant kulissene: kulisser.getchildren().add(hilsen);

Det kjente hallo-programmet Nå kan programmet kjøres: $ javac Hallo.java $ java Hallo

Koordinatsystemet Plassering Når vi har flere kulisser, må vi angi posisjonen så de ikke havner oppå hverandre. Koordinatsystemet er litt uvant: Y-aksen går nedover. x y Enheten er piksler på skjermen.

Et eksempel fra Harry Potter Symbolet for Deathly hallows fra Harry Potter-bøkene kan lages slik: et Circle-objekt sort rand med bredde 4; hvit innmat et Line-objekt brunt, med bredde 4 et Polygon-objekt purpurfarget rand med bredde 4; hvit innmat

Et eksempel fra Harry Potter import javafx.application.application; import javafx.stage.stage; import javafx.scene.scene; import javafx.scene.layout.pane; import javafx.scene.shape.*; import javafx.scene.paint.color; public class DeathlyHallows extends Application { @Override public void start(stage teater) { final double r = 63; Circle stein = new Circle(r); stein.setcenterx(100); stein.setcentery(224-r); stein.setstroke(color.black); stein.setstrokewidth(4); stein.setfill(color.white); Line stav = new Line(100,224, 100,0); stav.setstroke(color.brown); stav.setstrokewidth(4); Polygon kappe = new Polygon(0,224, 200,224, 100,0); kappe.setstroke(color.purple); kappe.setstrokewidth(4); kappe.setfill(color.white); Pane kulisser = new Pane(); kulisser.getchildren().add(kappe); kulisser.getchildren().add(stein); kulisser.getchildren().add(stav); Scene scene = new Scene(kulisser); teater.settitle("the deathly hallows"); teater.setscene(scene); teater.show();

Å plassere ting i et rute nett Plassering i rutenett Noen ganger trenger vi å plassere kulisser i et rutenett. Til det finnes klassen GridPane som selv er en kulisse. (Det er altså mulig å bygge kulisser på kulisser på kulisser... )

Å plassere ting i et rute nett import javafx.application.application; import javafx.application.platform; import javafx.stage.stage; import javafx.scene.scene; import javafx.scene.layout.pane; import javafx.scene.layout.gridpane; import javafx.scene.control.button; import javafx.scene.text.text; import javafx.scene.text.font; /* Brettet: 1 2 3 4 5 6 7 8 9 Spillerne: X - maskinen O - brukeren */ public class TTT0 extends Application { @Override public void start(stage teater) { GridPane rutenett = new GridPane(); rutenett.setgridlinesvisible(true); rutenett.add(new Text(" "), 0, 0); rutenett.add(new Text("X"), 1, 0); rutenett.add(new Text("X"), 2, 0); rutenett.add(new Text(" "), 0, 1); rutenett.add(new Text("O"), 1, 1); rutenett.add(new Text("X"), 2, 1); rutenett.add(new Text("O"), 0, 2); rutenett.add(new Text("O"), 1, 2); rutenett.add(new Text(" "), 2, 2); Pane kulisser = new Pane(); kulisser.getchildren().add(rutenett); Scene scene = new Scene(kulisser); teater.settitle("tripp-trapp-tresko"); teater.setscene(scene); teater.show();

Hva hvis jeg trenger en fil? Å be om et filnavn JavaFX kan også brukes til å be om et filnavn. La oss anta at vi har noen filer med farger angitt som RGB-verdier: 127 255 212 akvamarin.rgb Så kan vi i programmet vårt be brukeren velge en slik fil:

Hva hvis jeg trenger en fil? Klassen FileChooser Denne klassen gjør det enkelt å be brukeren om et filnavn: File file = new FileChooser(). showopendialog(teater); import javafx.application.application; import javafx.stage.stage; import javafx.scene.scene; import javafx.scene.layout.pane; import javafx.stage.filechooser; import javafx.scene.paint.color; import javafx.scene.shape.circle; import java.io.file; import java.util.scanner; public class VisFarge extends Application { @Override public void start(stage teater) { int r = 0, g = 0, b = 0; File file = new FileChooser().showOpenDialog(teater); try { Scanner f = new Scanner(file); r = f.nextint(); g = f.nextint(); b = f.nextint(); catch (Exception e) { Circle fargedemo = new Circle(100); fargedemo.setcenterx(100); fargedemo.setcentery(100); fargedemo.setfill(color.rgb(r,g,b)); Pane kulisser = new Pane(); kulisser.getchildren().add(fargedemo); Scene scene = new Scene(kulisser); teater.settitle("rgb-farge"); teater.setscene(scene); teater.show();

Dagens lille moralpreken Til slutt Husk JavaFX er et enormt bibliotek; det er lett å gå seg vill. Det er ofte mange måter å gjøre noe på, men ikke alle varianter passer sammen. Søking på internettet vil lett kunne gi kode som forvirrer mer enn den hjelper. Forelesningene og IN1010-introduksjonsheftet inneholder det man trenger å vite for å kunne lage enkle GUI-programmer, og løse oblig nr 6. Når du skal programmere GUI i IN1010, ta utgangspunkt i et program som finnes, og modifiser det. Skriv GUI-koden først og få den til å virke, før du begynner å lage den avanserte innmaten.