Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det: To måter. GUI (Graphical User Interface)-programmering

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

4. mars 2008 Grafisk brukergrensesnitt med Swing og awt Litt Modell Utsyn - Kontroll Del I. Stein Gjessing Inst for Informatikk Univ.

Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det: To måter. GUI (Graphical User Interface)-programmering. del 1. Litt Modell Utsyn - Kontroll

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

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

Uke mars 2005 GUI - del 2. GUI (Graphical User Interface)-programmering

Inf 1010 GUI - del 2

Inf mars 2010 GUI del 2

INF1010. Grafisk brukergrensesni. med Swing og awt del 2. INF Grafisk brukergrensesni4 II

Grafisk Brukergrensesnitt

6108 Programmering i Java. Leksjon 8. GUI: Grafisk brukergrensesnitt. Del 2: Roy M. Istad 2015

Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det, to typer av vinduer? GUI (Graphical User Interface)-programmering

GUI - del 2. Stein Gjessing Inst for Informatikk Univ. i Oslo

INF1010. Grafisk brukergrensesni. med Swing og awt del 2

Hvordan gjør vi det, to typer av vinduer? Om Grafiske Bruker-Grensesnitt (GUI) GUI (Graphical User Interface)-programmering

Grafiske brukergrensesnitt med Swing og AWT

Vi lærte sist å lage vinduer. Om å lage et vindu. GUI (Graphical User Interface)-programmering. GUI - del 2

Vi lærte sist å lage vinduer. Om å lage et vindu. GUI (Graphical User Interface)-programmering. Inf GUI - del 2

JPanel. Komponent hieraki. Window/JWindow. Applet/JApplet. JDialog. JFrame

UNIVERSITETET I OSLO

INF1010 våren 2006 Uke 19: 9. mai 2006 Et større eksempel: Solitaire (kabal)

Gjennomgang av eksamen H99

Kapittel 15: Grafiske brukergrensesnitt. Del II

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

. Ved sensur vl1 ahe bokstaverte deloppgaver (a, b, c,...) telle like mye.

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

EKSAMEN. TILLATTE HJELPEMIDLER: Alle trykte og skrevne. INNFØRING MED PENN, evt. trykkblyant som gir gjennomslag

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

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

LO191D/LC191D Videregående programmering

GUI («Graphical User Interface») del 2

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

GUI («Graphical User Interface») del 2

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE. Antall sider (Inkl forsiden): 8. Alle trykte og håndskrevne

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

Tittel Objektorientert systemutvikling 1. Eksamenstid, fra-til Ant. oppgaver 6

2 Om statiske variable/konstanter og statiske metoder.

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

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

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

Argumenter fra kommandolinjen

Prøveksamen 2004 INF1010 Operasystemet med GUI + Ordkryss (modifiserte løsninger etter innspill fra forelesningen) Arne Maus Inst for informatikk

Kapittel 13: Grafiske brukergrensesnitt. Java som første programmeringsspråk

Eksamensoppgave Vår 2012 Ordinær eksamen Bokmål. Videregående programmering. Eksamensdato: Studium/klasse: 2. klasse

Kapittel 13: Grafiske brukergrensesnitt. Java som første programmeringsspråk

ANTDAGER = 358; I Ifra nyttår 08 til 08 1ed julaften

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

Vi lærte sist å lage vinduer. Om å lage et vindu. GUI (Graphical User Interface)-programmering. Inf GUI - del 2

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

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

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

GUI («Graphical User Interface»)

Graphics. Grafikk. Praktisk sett: Koordinatsystemet. kodeeksempel

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) 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

INF1010 Binære søketrær ++

2 Om statiske variable/konstanter og statiske metoder.

Løsning på småoppgaver etter hvert underkapittel. kap

INF våren 2017

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

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

Fra Python til Java, del 2

Enkle generiske klasser i Java

Kapittel 15: Grafiske brukergrensesnitt. Del II

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

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

UNIVERSITETET I OSLO

Introduksjon til objektorientert programmering

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

Løsning på småoppgaver etter hvert underkapittel, kapittel 13 18

INF1010. Grensesnittet Comparable<T>

INF1010 oversikt med

Løsningsforslag Test 2

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

IN våren 2018 Tirsdag 16. januar

IN våren 2019 Onsdag 16. januar

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Velkommen til. INF våren 2016

Les gjennom hele oppgavesettet før du begynner å besvare deloppgavene.

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

UNIVERSITETET I OSLO

Løsningsforslag Videregående programmering, eksamen desember 2010

INF1010 våren Grensesnitt

LC191D/LO191D Videregående programmering mai 2010

UNIVERSITETET I OSLO

GUI («Graphical User Interface»)

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

Blokker og metoder INF1000 (Uke 6) Metoder

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

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

INF1000 : Forelesning 4

UNIVERSITETET I OSLO

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

Transkript:

4. mars 2008 Grafisk brukergrensesnitt med Swing og awt Litt Modell Utsyn - Kontroll Del I Stein Gjessing Inst for Informatikk Univ. i Oslo GUI (Graphical User Interface)-programmering I dag (så langt vi kommer) Hvordan lage et vindu på skjermen Hvordan legge ulike komponenter i vinduet (trykknapper, tekstfelter, tekst, bilder, mm) Grafikk (tegning i vinduet) Grafikk (tegning i vinduet) Kort om layout (utlegg? utseende?) av vinduer Litt om hvordan Java-programmet vårt fanger opp knappetrykk Et meget enkelt Model-Utsyn-Kontroll-eksempel Neste uke: Resten fra forrige gang Grundigere om hendelsesmodellen og oppfanging av tastaturtrykk, musterykk, musebevegselser. Mer om hvordan få data inn fra brukeren via vinduer (Brukeren trykker på knapper, fyller ut data,..) Hvordan får programmet tak i disse data? 2 Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det: To måter Data inn og ut i DOS-/kommandovinduet oftest ikke naturlig. GUI: Vi dekker bare litt, men nok til å gå videre selv. Javas klassebibliotek for GUI har mer enn 300 metoder, men bare et lite antall av disse nyttes i praksis. Ofte tar vi utgangspunkt i et eksempel som virker og utvider / innskrenker dette. Når man jobber i industrien, bruker man ofte verktøy for drag-anddrop konstruksjon av GUI. Dere skal lære GUI fra grunnen av og løse oppgavene med Swing og awt. Java system bestå av et litt eldre system awt, og et litt nyere system swing som er bygget på awt. Men Ikke alt er skrevet om, så vi trenger i nesten alle programmer å importere begge (-merk javax): import javax.swing.*; import java.awt.*; (De klasser som begynner på J er swing, resten er awt.) Kalssen JFrame lager vinduer. Kan enten bruke JFrame som den er, eller Lage en subklasse av JFrame og legge til den spesielle koden vi ønsker i subklassen. Eksempel: 3 4

Bruke klassen JFrame som den er import javax.swing.*; import java.awt.*; class RammeDemo { public static void main(string[] args) { JFrame ramme = new JFrame( Første vindu"); ramme. ramme.setsize(300, 200); ramme. Type: JFrame Navn: ramme Subklasse av JFrame (mest vanlig) import javax.swing.*; import java.awt.*; class RammeDemo2 extends JFrame { RammeDemo2() { // En annen måte å sette tittel på rammen: super( Første vindu"); setsize(300,200); public static void main(string[] args) { new RammeDemo2(); 5 6 Standard avslutning Dette bør med i alle vinduer Setter x i til å virke vanlig* Det er mange komponenter i et vindu ContentPane (vindusflate) Er nødvendig for at vinduet skal vise seg fram på skjermen Først lager vi vinduet med alle dens felter, trykkknapper,..osv, så viser vi det fram (komponenter) Alle komponenten legges på vindusflaten * Prøv uten og se hva som skjer 7 8

2D grafikk tegning i (en del av) vinduet Alle klassene i Swing og awt har paint() metoder som kalles når systemet får beskjed om å vise noe på skjermen eks. setvisble(true). Vi kaller aldri disse direkte bare indirekte via repaint() og setvisible(true) metodene Vi lager selv vår versjon av paint() eller paintcomponent() når vi vil lage grafikk i en flate f.eks. et JPanel Når metodene paint() eller paintcomponent() som vi har laget, kalles fra systemet, får de med en parameter, Graphics g, og det er på denne g vi skal tegne 9 import javax.swing.*; import java.awt.*; class Firkant extends JPanel { Firkant() { // angir foretrukket størrelse på dette lerretet. setpreferredsize(new Dimension(200, 200)); public void paintcomponent(graphics g) { // Her tegner vi g.drawrect(50, 50, 100, 100); class FirkantDemo extends JFrame { FirkantDemo() { settitle("firkantdemo"); // enda en måte å sette tittel på Container lerret = getcontentpane(); // peker til vindusflaten JPanel panel = new Firkant(); // lag panel (med firkant ) lerret.add(panel); // legg firkanten inn pack( ); //passe stort vindu // gjør alt synlig public static void main(string[] args) { new FirkantDemo(); 10 10 firkanter public void paintcomponent (Graphics g) { for (int i = 0; i < 100; i += 10) g.drawrect(50+i, 50+i, 100+i, 100+i); public void paintcomponent (Graphics g) { for (int i = 0; i < 100; i += 10){ g.setcolor(color.cyan); g.fillrect(10+i, 10+i, 100+i, 100+i); g.setcolor(color.white); g.drawrect(10+i, 10+i, 100+i, 100+i); Tekst og linjer Bytter ut class Firkant i eksempelet: class Firkant extends JPanel { int topp = 50, kant= 100, vside= 40; Firkant( ) { setpreferredsize(new Dimension(vside+kant+vside, topp+kant+30)); public void paintcomponent(graphics g) { super.paintcomponenet(g); // prøv med og uten g.setcolor(color.cyan); g.fillrect(vside, topp, kant, kant); g.setcolor(color.black); Font skrift = new Font("SansSerif",Font.BOLD,12); g.setfont(skrift); g.drawstring("firkant",vside+5,topp + kant/2); g.setcolor(color.white); g.drawline(vside+5,topp+kant/2+5,vside+kant-5,topp+kant/2+5); 11 12

Hva gjør vi når vi lager et vindu forenklet versjon (flere punkter for mer kompliserte vinduer senere). 1. Vi lager et objekt for vinduet, subklasse av JFrame og setter navn på rammen 2. Kan sette størrelsen setsize(300, 200); 3. Får tak i en peker til vinduesflaten Container lerret = getcontentpane(); 4. Lager objekter for alle de komponentene vi vil ha i vinduet og legger alle disse inn i vindusflaten lerret.add(..<peker til et objekt for en komponent >,...) 5. Setter inn at avslutningsknappen skal virke: 6. Sier fra at vinduet skal vise seg fram Noen komponenter vi kan legge inn JButton: JButton knapp = new JButton("Trykk her ); En knapp som brukeren kan trykke på. Parameteren i konstruktøren angir teksten på knappen. JLabel: JLabel etikett = new JLabel("Skriv inn navn"); En etikett som kan inneholde enten tekst eller bilder. Brukes ofte som ledetekst til JText-Field. JTextField: JTextField tekstfelt = new JTextField(30); Et tekstfelt hvor brukeren kan skrive inn tekst. Metoden gettext() returnerer teksten i feltet. JTextArea: JTextArea tekstvindu = new JTextArea(10, 30); Et tekstvindu hvor programmet kan vise fram tekst. Metoden gettext() returnerer teksten i vinduet. JScrollPane: JScrollPane rullevindu = new JScrollPane(tekstvindu); Lager horisontale og vertikale rullefelt rundt et element. Brukes ofte i sammenheng med JTextArea som legges inn i rullevinduet. Parameteren er elementet vi ønsker lagt inn i rullevinduet. JPanel (som vi alt har sett) : JPanel panel = new JPanel(); Et panel som kan inneholde andre komponenter. 13 14 Mer om å lage et panel og legge ting inn i det. Deretter legges panelet inn i vindusflaten // start og avslutning som før, dette er inne i konstruktøren // Først lages elementene: JButton knapp = new JButton("Trykk her"); JLabel etikett = new JLabel("Skriv inn navn"); JTextField tekstfelt = new JTextField(30); JTextArea tekstvindu = new JTextArea(10, 30); JScrollPane rullevindu = new JScrollPane(tekstvindu); // Lager et panel og legger elementene til dette. JPanel panel = new JPanel(); panel.add(knapp); panel.add(etikett); panel.add(tekstfelt); panel.add(rullevindu); // tekstvinduet er inne i rullevinduet vindu med komponenter (ikke bra utseende) Slik det blir når det kommer opp Etter å ha dradd i det (laget mindre bredde). Rullefeltet framkommer når vi fyller tekstfeltet //Får tak i peker til vindues lerret og legger panelet inn Container lerret = getcontentpane(); // er inne i et JFrame-obj. lerret.add(panel); 15 16

To viktige begreper Container Klasse(r) som kan inneholde komponenter og andre Containere (som igjen kan inneholde...) JFrame har en innebygd Container som alt skal legges i som skal inn i vinduet, og vi får tak i den med: getcontentpane(); Panel er en (subklasse av) Container Layoutmanager Er klasser som automatisk sørger for at det vi legger inn (add () ) i en Container blir ordnet i en bestemt rekkefølge. og at plasseringen av komponentene blir OK hvis brukeren endrer størrelsen på vinduet. Alle Containere har en bestemt standard layoutmanager (hvis vi ikke endrer den) JPanel har FlowLayout (fra venstre mot høyre (i en (eller flere) rekke(r))) Den innebygde Containeren i JFrame har BoarderLayout ( fem felt: NORTH, WEST, SOUTH, EAST og CENTER) eks: panel.add(knapp,borderlayout.north); NB: Ulike LayoutMangere har add()-metoder med ulikt antall parametre. Husk å bruk dem riktige (ellers skjer ingen ting (?)) 17 Layoutmanagers: Layoutmanagere: Bordelayout BoxLayout CardLayout FlowLayout GridBagLayout GridLayout SpringLayout http://java.sun.com/docs/books/tutorial/uiswing/layout/layoutlist.html http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html 18 Bruk av BorderLayout (start og slutt som før) Grid Layout (start og slutt som før) Container lerret = getcontentpane(); lerret.setlayout(new GridLayout(3, 2)); // 3 rader, 2 kolonner lerret.add(new JLabel("Fornavn")); Container lerret = getcontentpane(); lerret.setlayout(new BorderLayout()); lerret.add(new JButton("NORD"), BorderLayout.NORTH); lerret.add(new JButton("SØR"), BorderLayout.SOUTH); lerret.add(new JButton("ØST"), BorderLayout.EAST); lerret.add(new JButton("VEST"), BorderLayout.WEST); lerret.add(new JButton("SENTER"),BorderLayout.CENTER); 19 lerret.add(new JLabel("Etternavn")); lerret.add(new JLabel("Telefon")); Vi legger inn radvis i tabellen. Å legge rett inn med new som her, virker ikke hvis vi vil ha input etterpå (fordi vi ikke har noen pekere til komponentene). 20

Vi endrer til FlowLayout (start og slutt som før) Container lerret = getcontentpane(); lerret.setlayout(new FlowLayout()); lerret.add(new JLabel("Fornavn")); lerret.add(new JLabel("Etternavn")); lerret.add(new JLabel("Telefon")); Kombiner flere layout i ett vindu settitle("kombilayout"); // Lager komponentene JButton knapp = new JButton("Trykk her"); JLabel etikett = new JLabel("Skriv inn navn"); JTextField tekstfelt = new JTextField(30); etikett.setlabelfor(tekstfelt); JTextArea tekstvindu = new JTextArea(10, 30); JScrollPane rullevindu = new JScrollPane(tekstvindu); // Benytter GridLayout. JPanel tekstpanel = new JPanel(); tekstpanel.setlayout(new GridLayout(2, 1)); tekstpanel.add(etikett); tekstpanel.add(tekstfelt); // Legger panelet og resten av komponentene i JFrame-en Container lerret = getcontentpane(); lerret.add(tekstpanel, BorderLayout.NORTH); lerret.add(rullevindu, BorderLayout.CENTER); lerret.add(knapp, BorderLayout.WEST); Lag ett eller flere JPanel, gi dem hver sin layout Adder komponentene i de ulike panelene og evt. også rett i lerret Adder Panelene i lerret Vi legger inn etter hverandre. 21 22 En knappe med reaksjon Hvordan lage en knapp som lytter JButton knapp; knapp= new JButton("Hei"); knapp Hei Dette objektet vil synes på skjermen (som en knapp) Legger knappen inn i vinduet Vi skal lage det aller enkleste programmet vi kan tenke oss med én knapp som reagerer på at vi trykker på den ved å gi en utskrift i dos-vinduet: C:\javaprog> javac Vindu.java C:\javaprog> java Vindu noen sa hei til meg noen sa hei til meg noen sa hei til meg getcontentpane().add(knapp); knapp.addactionlistener(knappelyttter); NYTT: Sier fra hvem som skal lytte etter trykk på denne knappen (mer på neste side) 23 24

knapp Hva skjer ved et knappetrykk? Dette objektet synes på skjermen (som en knapp) Hei knappelytter knapp.addactionlistener(knappelytter); forteller kjøresystemet at objektet som knappelytter peker på skal ha beskjed når noe skjer med knappen knapp. Objektet som knappelytter peker på blir satt opp som lytter ( actionlistener ) for knappen knapp. Kobling i kjøre-systemet Vindu ( ) objekt av den ferdiglagde klassen JButton Hei knapp knapp= new JButton("Hei"); getcontentpane().add(knapp); knappelytter = new Lytter( ); knapp.addactionlistener(knappelytter); getcontentpane() setvisible(); objekt av klassen Vindu (subklasse av JFrame) knappelytter Dette objektet lytter på knappen actionperformed( ) Når noen trykker på knappen, kaller kjøresystemet metoden actionperformed i det objektet som er satt opp som lytter for denne knappen. 25 setsize(... ) objekt av klassen Lytter (implements actionlistener) actionperformed (... ) System.out.println("Noen sa hei til meg"); 26 Klassedatastrukturen til class Vindu Fullstending mini-program med bare en knapp (og utskrift i DOS-vinduet) import java.awt.*; import java.awt.event.*; import javax.swing.*; main (...) Frame vindu = new Vindu(); vindu Vindu-objektet (konstruktøren) ordner så resten selv. objekt av klassen Vindu (se forrige side) 27 public class Vindu extends JFrame { private JButton knapp; private Lytter knappelytter; public Vindu( ) { super("hei test"); Container samling = getcontentpane(); samling.setlayout(new FlowLayout()); setsize(300,200); knapp= new JButton("Hei"); samling. add(knapp); knappelytter = new Lytter( ); knapp.addactionlistener(knappelytter); // slutt Vindu konstruktør Metoden getcontenetpane() i JFrame returnerer bildeflaten til dette vinduet Her lager vi et lytterobjekt Her kobles knappen opp mot dette lytterobjektet 28

Program forts. public static void main(string[] args) { JFrame vindu = new Vindu(); //slutt main class Lytter implements ActionListener { public void actionperformed(actionevent e) { System.out.println("Noen sa hei til meg"); // slutt class Lytter // slutt class Vindu Kjøring (Windows) Dette er lytterklassen! Nytt, viktig og enkelt eksempel: Mini-program med tre deler Kontroll Sørger for at datastrukturen blir manipulert på riktig måte (økt med én hver gang knappen tykkes) Sørger for at forandringer i datastrukturen blir skrevet ut. Utsyn En knapp som gir beskjed til kontrollen hver gang den blir trykket på Kan skrive ut en tekst som angir hvordan datastrukturen nå ser ut (hvor stort tallet er blitt) Modell Datastrukturen er bare ett tall med to operasjoner (legg til én og les av) C:\javaprog> javac Vindu.java C:\javaprog> java Vindu Noen sa hei til meg Noen sa hei til meg Noen sa hei til meg C:\javaprog> 29 30 knapptrykket() datastrukt Objekt av class Kontroll Kontroll(){ datastrukt = new Modell(4); vindu = new Utsyn(this); int tall; datastrukt.oppdater(); tall= datastrukt.hentnyverdi(); vindu.skrivut(tall); vindu Objekt av class JButton Objekt av class JLabel knapp tekst kntrl Utsyn (Kontroll kontrl) super("tre deler eksempel 1"); kntrl = kontrl; public class Kontroll { Modell datastrukt; Utsyn vindu; Kontroll(){ datastrukt = new Modell(4); vindu = new Utsyn(this); -main er minimal - Kontroll-konstruktøren lager de to andre objektene - actionperformed (neste side) kaller knapptrykket int antall; Modell (int tall) { antall = tall; int hentnyverdi() { return antall; oppdater() { antall ++; antall Objekt av class Modell tekst = new JLabel("Her kommer.. "); getcontentpane(). add(tekst); knapp= new JButton("Øk"); getcontentpane(). add(knapp); knapp.addactionlistener(new KnappLytter); skrivut(int tall) { tekst.settext( Tallet er + tall); Objekt av class Utsyn 31 public static void main(string[] args) { new Kontroll(); //end main public void knapptrykket(){ int tall; datastrukt.oppdater(); tall= datastrukt.hentnyverdi(); vindu.skrivut(tall); // slutt Kontroll 32

class Utsyn extends JFrame { JButton knapp; JLabel tekst; Peker tilbake til Kontroll-objektet Kontroll kntrl; class KnappeLytter implements ActionListener { // indre klasse public void actionperformed(actionevent e) { kntrl.knapptrykket(); public Utsyn(Kontroll kontrl){ og her brukes den super("tre deler eksempel 1"); setfont(new Font("Serif", Font.PLAIN,18)); setsize(400,100); kntrl = kontrl; getcontentpane().setlayout(new FlowLayout()); tekst = new Label("Her kommer en melding"); getcontentpane().add(tekst); knapp= new Button("Øk"); getcontentpane().add(knapp); knapp.addactionlistener(new KnappeLytter()); // slutt Utsyn konstruktør Datastruktur class Modell{ private int antall; Modell (int tall) { antall = tall; public int hentnyverdi( ) { return antall; public void oppdater( ) { antall ++; // slutt klass Modell; Som sagt: Enkleste datastruktur vi kan tenke oss // slutt class Utsyn public void skrivut(int tall){ tekst.settext( Tallet er nå: + tall + ); 33 34 Kjøresystemet Objekt av class JButton Øk Objekt av class JLabel Flere knapper: Flere lytterklasser: Objekt av class Kontroll Kontroll() datastrukt = new Modell(4); vindu = new Utsyn(this); knapptrykket() knapp tekst Utsyn (Kontroll kontrl)... tekst = new JLabel("Her kommer en melding"); getcontentpane().add(tekst); knapp= new JButton("Øk"); getcontentpane().add(knapp); knapp.addactionlistener(new KnappLytter()); enknapp = new JButton( Noe"); enknapp.addactionlistener(new NoeSkjer()); stoppknapp = new JButton("Reboot"); stoppknapp.addactionlistener(new Stopp()); public void knapptrykket(){ int tall; datastrukt.oppdater(); tall= datastrukt. hentnyverdi(); vindu.skrivut(tall); datastrukt vindu kntrl objeket av class KnappLytter actionperformed (ActionEvent e) { kntrl.knapptrykket(); skrivut(int tall) { lab.settext( Tallet er : + tall); Objekt av class Utsyn class KnappLytter (indre klasse) 35 Det er mulig å bruke en klasse med en ActionListener-metode, og test på hvilken knapp som ble trykket på (neste side) class Stopp implements ActionListener { public void actionperformed(actionevent e) { setvisible(false); // omliggende vindu System.exit (0); // end ReB class NoeSkjer implements ActionListener { public void actionperformed(actionevent e) {..... // end WaitB 36

Flere knapper: ett lytte-objekt class Forskjellig implements ActionListener { public void actionperformed(actionevent e) { if (e.getsource( ) = = stoppknapp) { setvisible(false); System.exit (0); else if (e.getsource( ) = = enknapp) {... ActionListener lytter = new Forskjellig(); enknapp = new JButton( Noe"); enknapp.addactionlistener(lytter); stoppknapp = new JButton("Reboot"); stoppknapp.addactionlistener(lytter); 37