Mer om grafiska komponenter. Händelsestyrda program

Relevanta dokument
Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers. Exempel: FlowLayout. Klassen FlowLayout

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

Föreläsning 3: Händelsestyrda program och användargränssnitt

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Java-concept och Swing. Swing low, sweet chariot

Laboration 15 Grafiskt användargränssnitt

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 18

Föreläsning 13: Swing (GUI), händelser, timer

OOP Objekt-orienterad programmering

2I1049 Föreläsning 8. Grafiska gränssnitt i Java. AWT-komponenter. Grafiska gränssnitt, Java interface och händelsehantering

OOP Objekt-orienterad programmering

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

Lösningsförslag till tentamen

Grafiska komponenter.

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. LayoutManagers. Exempel på några av komponenterna

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna

Händelsestyrda program

Lektion Händelsehanterare

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Lösningsförslag till tentamen

SMD091 Lektion 9. Definition. Inkapsling. Lite repetition. Grafik. Gränssnitt Definition och Implementation. Sammansättning... Implementation.

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Föreläsning 9. Arv Grafiska komponenter

Arv. Grafiska komponenter. Arv. Arvhierarki. Arv. Föreläsning 12 (OH-bilder 9)

Rita Egna Bilder, Timer

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Properties. Användbara metoder som kan anropas i propertychanged:

lgammal2.txt // Lösningar till gammal tentamen // Uppgift 1 a

Lösningsförslag till tentamen

Repetitionsföreläsning 2: Quiz & problemlösning med swing Inget nytt material.

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

MVC-mönstret. model-view-control i Swing

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Föreläsning 14: Grafik & mera händelsehantering

Projekt 2 XL. Observer-mönstret

Grafiska användargränsnitt i Java. Föreläsning 7 Innehåll. Använda klasspaketet Swing. Klasspaket i Java. Grafiska användargränsnitt i Java

Lösningsförslag till tentamen

Laboration 4: Game of Life

Malmö högskola 2007/2008 Teknik och samhälle

Lösningsförslag till tentamen

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Objektorienterad Programmering DAT043. Föreläsning 5 29/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

kl

Iteration while-satsen

Rörliga figurer Klassen Timer Testning av program Något om applets

Lab5 för prgmedcl04 Grafik

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

GUI-program med Swing

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Lösningsförslag till tentamen

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Lösningsförslag till tentamen

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

Frames, menyer och GUI-program

Laboration 24 Databasen MySQL och java

Programstyrd / händelsestyrd

Tentamen i Objektorienterad programmering

for-satsen Fält for-satsen Föreläsning 8 (OH-bilder 7) for-satsen for-sats är en styrsats för iterationer. for-sats har följande generella utseende:

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Grafiskt användargränssnitt (GUI-Graphical User Interface) intro Komponenter

Föreläsning 6. Top-Down Design Parameteröverföring

Lösningar för tenta 3 DAT043,

LiTHehack? Här? lithehack se koma Tisdagar och torsdagar

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Mer om klasser och objekt

Fönsterhantering, grafik

Grafiska program i Java. AWT och Swing? AWT. Swing. JButton. Button

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Malmö högskola 2007/2008 Teknik och samhälle

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna.

1 Grafiska komponenter

Föreläsning 3. Iteration while-satsen

Grafiska användargränssnitt i Java

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Lösningsförslag till tentamen

Tentamen , Grundläggande programmering i Java

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. Exempel på några av komponenterna. LayoutManagers.

Malmö högskola 2007/2008 Teknik och samhälle

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

TENTAMEN. Kurs: Applikationsutveckling i Java 5DV135. Ansvarig lärare: Johan Eliasson. HT12 Datum: Tid: kl

Arv och Grafiska Användargränssnitt

Föreläsning Arv. Föreläsning 9. Arv Grafiska komponenter. Grafiska komponenter. Arv. Arv

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

ITK:P1 Föreläsning 8. Verktyget Javadoc. Kommentarer för Javadoc. Multimedia för spelkonstruktion

Föreläsning 11. Att rita egna bilder.

Transkript:

Layout Managers TDA143 I1 Programmerade system Föreläsning 14 (OH-bilder 10) Mer om grafiska komponenter. Händelsestyrda program Utplaceringen av komponenter i en behållare styrs med en Layout Manager. Det finns olika Layout managers: FlowLayout GridLayout BorderLayout CardLayout GridBagLayout Christer Carlsson 1 2 FlowLayout Den enklaste (och kanske minst användbara) Layout Managern är FlowLayout. Komponenterna placeras ut radvis. Får inte en komponent plats på en rad påbörjas automatiskt nästa rad. Man styra huruvida raderna skall fyllas på från vänster eller höger. Det går även att styra avståndet mellan komponenterna i x- respektive y-led. Komponenteran flyttas om storleken på fönstret förändras Exempel på FlowLayout public class VisaFlowLayout extends JFrame { private JButton[] knappar = new JButton[10]; public VisaFlowLayout() { settitle("visa FlowLayout"); getcontentpane().setlayout( new FlowLayout(FlowLayout.LEFT,10,20)); for (int i = 0; i < knappar.length; i = i + 1) { knappar[i] = new JButton("Knapp " + (i+1)); knappar[i].setforeground(color.blue); knappar[i].setbackground(color.pink); getcontentpane().add(knappar[i]); //VisaFlowLayout public static void main(string[] args) { JFrame f = new VisaFlowLayout(); f.setsize(400,200); f.setvisible(true); //main //VisaFlowLayout Använda metoder: add setbackground setforeground settitle setsize setvisible placeras ut komponenter i behållaren sätter bakgrundsfärg sätter förgrundsfärg sätter titeln i fönsterramen sätter storleken anger om komponenten skall visas eller inte Ett objekt av klassen JFrame har flera olika delar, t.ex. en menyrad, fönstrets kant och huvudytan. Huvudytan, som används för att lägga olika komponenter i, kommer man åt med metoden getcontentpane(). 3 4

GridLayout När GridLayout används delas behållaren in i ett antal rader och kolumner, i vilka komponenterna placeras ut radvis. Utplaceringen sker från vänster till höger. Det är möjligt att styra avståndet mellan komponenterna i x- respektive y-led. Komponenteran flyttas INTE om storleken på fönstret förändras Exempel på GridLayout public class VisaGridLayout extends JFrame { private JButton[] knappar = new JButton[10]; public VisaGridLayout() { settitle("visa GridLayout"); getcontentpane().setlayout( new GridLayout(4, 3, 10, 20)); for (int i = 0; i < knappar.length; i = i + 1) { knappar[i] = new JButton("Knapp " + (i+1)); knappar[i].setforeground(color.blue); knappar[i].setbackground(color.pink); getcontentpane().add(knappar[i]); public static void main(string[] args) { JFrame f = new VisaGridLayout(); f.setsize(400,200); f.setvisible(true); //main //VisaGridLayout Satsen setdefaultcloseoperation(exit_on_close) gör det möjligt att avsluta programmet genom att stänga fönstret via stängningsrutan i fönstrets ram. 5 6 BorderLayout När BorderLayout används delas behållaren in i fem delar. Dessa delar kallas North, South, West, East och Center. Vid utplacering av en komponent anges var komponenten skall placeras. Utelämnas någon av platserna North, South, West eller East får de storleken 0. Platsen Center får alltid det utrymme som "blir över". Det är möjligt att styra avståndet mellan komponenterna i x- respektive y-led. Exempel på BorderLayout public class VisaBorderLayout extends JFrame { private JButton öster = new JButton("Öster"); private JButton söder = new JButton("Söder"); private JButton väster = new JButton("Väster"); private JButton norr = new JButton("Norr"); private JButton mitten = new JButton("Mitten"); public VisaBorderLayout() { öster.setforeground(color.blue); öster.setbackground(color.pink); söder.setforeground(color.blue); söder.setbackground(color.pink); väster.setforeground(color.blue); väster.setbackground(color.pink); norr.setforeground(color.blue); norr.setbackground(color.pink); mitten.setforeground(color.blue); mitten.setbackground(color.pink); settitle("visa BorderLayout"); getcontentpane().setlayout(new BorderLayout(5, 10)); getcontentpane().add("east", öster); getcontentpane().add("south", söder); getcontentpane().add("west", väster); getcontentpane().add("north", norr); getcontentpane().add("center", mitten); setdefaultcloseoperation(exit_on_close) public static void main(string [] args) { VisaBorderLayout window = new VisaBorderLayout(); window.setsize(400,200); window.setvisible(true); //main //VisaBorderLayout 7 8

Exempel från förra föreläsningen: public class Kast1 extends JFrame { private JTextField hfield = new JTextField( 20); private JTextField vfield = new JTextField( 20); private JLabel resultatlabel = new JLabel(); public Kast1() { JLabel hlabel = new JLabel("Ange utgångshastighet: "); JLabel vlabel = new JLabel("Ange kastvinkel: "); hlabel.setbackground(color.pink); hlabel.setopaque(true); vlabel.setbackground(color.orange); vlabel.setopaque(true); JPanel frågepanel = new JPanel(); frågepanel.setlayout(new GridLayout(2,2)); frågepanel.add(hlabel); frågepanel.add(hfield); frågepanel.add(vlabel); frågepanel.add(vfield); resultatlabel.setbackground(color.yellow); resultatlabel.setforeground(color.magenta); resultatlabel.setopaque(true); getcontentpane().setlayout(new GridLayout(2,1)); getcontentpane().add(frågepanel); getcontentpane().add(resultatlabel); pack(); setvisible(true); public static void main (String[] arg) { Kast1 k = new Kast1(); //main //Kast1 Händelsehantering Händelsestyrda program brukar bestå av två faser: Först genomlöps initieringsfasen. I den initierar man de olika grafiska komponenterna som skall användas i programmet. Man definierar också de sk callback-funktioner som skall ta hand om de händelser man är intresserad av. I Java definieras callback-funktionerna som metoder i speciella lyssnare. När initieringsfasen är klar går programmet in i väntefasen. I väntefasen ligger programmet och väntar på att en yttre händelse skall inträffa. Händelsen tas om hand av lyssnaren och den callback-funktion som är kopplad till händelsen utförs. 9 10 Händelsehantering ActionEvent och ActionListener Det önskade beteendet i vårt program är att om vi i någon av inmatningsrutorna ändrar datavärde skall programmet beräkna och skriva ut nya utdatavärden från de aktuella indatavärdena genom att vi i någon av inmatningsrutorna trycker på sändningstangenten. När vi trycker på sändningstangenten i en inmatningsruta (JTextField) eller med musknappen på en knapp (JButton) inträffar en händelse av klassen ActionEvent. De lyssnare som lyssnar på händelser av klassen ActionEvent är av klassen ActionListener. Det finns många olika händelsetyper i Java, och varje händelsetyp har sin egen typ av lyssnare. Några av de vanligaste händelsetyperna är: Vi måste således förse inmatningsrutorna med en lyssnare och skriva en callback-funktion som utför de beräkningar vi vill göra. ActionEvent Vanliga händelser, som t ex att någon har tryckt på en knapp (JButton) MouseEvent Händelser med musen, som t ex att en musknapp har tryckts ned eller släppts MouseMotionEvent När muspekaren har rört på sig KeyEvent Tangentbordshändelser. Man kan dels lyssna på när tangenter trycks ned och släpps upp och dels på när de faktiskt producerar ett tecken ComponentEvent Förändringar av en komponent, t ex att dess storlek har ändrats (ofta som följd av att hela fönstrets storlek har ändrats) WindowEvent Händelser för ett fönster, som t ex att det är på väg att stängas eller har ikonifierats I denna kurs behandlar vi endast händelsetypen ActionEvent. 11 12

Hur använder man lyssnare? Följande tre steg måste göras för att kunna lyssna på, fånga upp och agera på en händelse av typen ActionEvent: 1. Skriv en actionperformed-metod i huvudklassen. Detta görs genom att lägga till metoden public void actionperformed(actionevent e) i klassen: Det är denna metod som exekveras när händelsen inträffar. 2. Ange att huvudklassen en lyssnare, dvs att den innehåller en actionperformed-metod. Detta görs genom att i deklarationen av klassen lägga till texten implements ActionListener public class Klass extends JFrame implements ActionListener 3. Registrera att huvudklassen skall lyssna efter ActionEvent-händelser på den aktuella komponenten: komponent.addactionlistener(this) Till actionperformed skickas ett objekt av klassen ActionEvent. Detta objekt kan man använda till att ta reda på för vilken komponent händelsen inträffat. Genom att anropa metoden e.getsource( ) fås en referens till komponenten där händelsen e inträffat. Vårt tidigare exempel import java.awt.event.*; import java.text.*; public class Kast extends JFrame implements ActionListener { private JTextField hfield = new JTextField(20); private JTextField vfield = new JTextField(20); private JLabel resultatlabel = new JLabel(); public Kast() { JLabel hlabel = new JLabel("Ange utgångshastighet: "); JLabel vlabel = new JLabel("Ange kastvinkel: "); hlabel.setbackground(color.pink); hlabel.setopaque(true); vlabel.setbackground(color.orange); vlabel.setopaque(true); hfield.addactionlistener(this); vfield.addactionlistener(this); JPanel frågepanel = new JPanel(); frågepanel.setlayout(new GridLayout(2,2)); frågepanel.add(hlabel); frågepanel.add(hfield); frågepanel.add(vlabel); frågepanel.add(vfield); resultatlabel.setbackground(color.yellow); resultatlabel.setforeground(color.magenta); resultatlabel.setopaque(true); getcontentpane().setlayout(new GridLayout(2,1)); getcontentpane().add(frågepanel); getcontentpane().add(resultatlabel); pack(); setvisible(true); 13 14 Fortsättning: public void actionperformed(actionevent e) { if (e.getsource() == hfield e.getsource() == vfield) { calculate(); //actionperformed public void calculate( ) { final double G = 9.81; double h, v, d, alfa; String indata; NumberFormat r = NumberFormat.getInstance(); r.setmaximumfractiondigits(2); r.setminimumfractiondigits(2); indata = hfield.gettext(); v = Double.parseDouble(indata); indata = vfield.gettext(); alfa = Double.parseDouble(indata); alfa = Math.toRadians(alfa); h = (Math.pow(v, 2) * Math.pow(Math.sin(alfa), 2))/(2*G); d = (Math.pow(v, 2) * Math.sin(2*alfa))/G; resultatlabel.settext("banhöjden är " + r.format(h) + "\n" + " och kastlängden är " + r.format(d)); //calculate Ett exempel till Antag att vi har en klass GraphicDice som definierar en grafisk tärning. I klassen finns bl.a följande metoder: GraphicDice() GraphicDice(int dots) roll() int getdots() setempty() konstruktor som skapar en "tom" tärning konstruktor som som sätter tärningens värd till dots kastar tärningen avläser värdet på tärningen sätter tärningen till "tom" Vi vill skriva ett program där vi upprepade gånger kan kasta tärningen och kunna se tärningens värde dels grafiskt, dels som text (enligt figuren nedan). public static void main (String[] arg) { Kast k = new Kast(); //main //Kast 15 16

Implementation: import java.awt.event.*; public class TestDice extends JFrame implements ActionListener { private JButton kastabutton = new JButton("KASTA"); private GraphicDice thedice = new GraphicDice(); private JLabel dotslabel = new JLabel(); public TestDice() { getcontentpane().setlayout(new GridLayout(3,1)); getcontentpane().add(thedice); getcontentpane().add(dotslabel); kastabutton.addactionlistener(this); getcontentpane().add(kastabutton); public void actionperformed(actionevent e) { if (e.getsource() == kastabutton) { thedice.roll(); thedice.repaint(); int dots = thedice.getdots(); dotslabel.settext(" Poängen är " + dots); //actionperformed public static void main(string [] args) { TestDice td = new TestDice(); td.setsize(150,300); td.setvisible(true); //main //TestDice Allmänna tips Swing är stort, och det är svårt (och onödigt) att hålla alla detaljer i minnet angående vilka klasser och metoder som finns tillgängliga. Det rekommenderas därför starkt att man har tillgång till en bra bok eller onlinedokumentation när man programmerar. 17 18