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

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

Mer om grafiska komponenter. Händelsestyrda program

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

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

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

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

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

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

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

Lösningsförslag till tentamen

Lösningsförslag till tentamen

Laboration 15 Grafiskt användargränssnitt

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

OOP Objekt-orienterad programmering

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

OOP Objekt-orienterad programmering

Java-concept och Swing. Swing low, sweet chariot

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

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

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

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

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

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

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

Laboration 4: Game of Life

Grafiska komponenter.

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

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

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

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

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

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

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

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

Lektion Händelsehanterare

Lösningsförslag till tentamen

Lösningsförslag till tentamen

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

Lösningsförslag till tentamen

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

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

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

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

Rita Egna Bilder, Timer

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

Projekt 2 XL. Observer-mönstret

Föreläsning 9. Arv Grafiska komponenter

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

kl

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

Händelsestyrda program

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

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

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

Lösningsförslag till tentamen

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

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

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 )

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

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

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

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Lab5 för prgmedcl04 Grafik

Lösningar för tenta 3 DAT043,

Tentamen i Objektorienterad programmering

GUI-program med Swing

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

Trådar. Motivering. Många program måste kunna hålla på med flera saker samtidigt, till exempel. fleranvändarsystem.

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Laboration 24 Databasen MySQL och java

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

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

Tentamen i Objektorienterad programmering

Lösningsförslag till tentamen

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Lösningsförslag till tentamen

Lösningar till tentamen i EDAF25

1 Grafiska komponenter

Föreläsning 10. ADT:er och datastrukturer

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Föreläsningar nov 19, nov 20 v 47.

Fönsterhantering, grafik

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

Lösningsförslag till tentamen

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

Frames, menyer och GUI-program

a. Vilka av följande påståenden är riktiga? Observera att felaktigt valda påståenden ger poängavdrag. (4p)

Tentamen , Grundläggande programmering i Java

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

Föreläsning 3. Iteration while-satsen

2I1073 Lektion 2. Lektion 2a. Lektion 2a. Servlets, säkerhet, och filhantering. import java.io.*; import javax.servlet.*; import javax.servlet.http.

Tentamen FYTA11 Javaprogrammering

Transkript:

Layout Managers Föreläsning 10 Mer om grafiska komponenter Händelsestyrda program Föreläsn Utplaceringen av komponenter i en behållare styrs med en layout manager. Det finns olika layout managers: FlowLayout GridLayout BorderLayout CardLayout GridBagLayout Mer om grafiska 2 Klassen FlowLayout Den enklaste (och kanske minst användbara) layout managern är klassen 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. Komponenterna förflyttas då storleken på fönstret förändras. Exempel: FlowLayout public class ShowFlowLayout extends JFrame { private JButton[] knappar = new JButton[10]; public ShowFlowLayout() { getcontentpane().setbackground(color.yellow); settitle("visa FlowLayout"); 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); add(knappar[i]); //constructor JFrame f = new ShowFlowLayout(); f.setsize(400,200); f. //main //ShowFlowLayout 3 4

Använda metoder: add setbackground setforeground settitle setsize setvisible Exempel på FlowLayout 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(). 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. Klassen 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. Komponenterna förflyttas INTE då storleken på fönstret förändras, utan storleken på komponenterna anpassas efter fönstrets storlek. 5 6 Exempel: GridLayout Klassen BorderLayout public class ShowGridLayout extends JFrame { private JButton[] knappar = new JButton[10]; public ShowGridLayout() { getcontentpane().setbackground(color.yellow); settitle("visa GridLayout"); 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); add(knappar[i]); //constructor JFrame f = new ShowGridLayout(); f.setsize(400,200); f. //main //ShowGridLayout 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. Det är möjligt att styra avståndet mellan komponenterna i x- respektive y-led. När storleken på fönstret förändras får platsen Center det utrymme som blir över. 7 8

Exempel: BorderLayout public class ShowBorderLayout extends JFrame { private JButton east = new JButton("Öster"); private JButton south = new JButton("Söder"); private JButton west = new JButton("Väster"); private JButton north = new JButton("Norr"); private JButton center = new JButton("Mitten"); public ShowBorderLayout() { getcontentpane().setbackground(color.yellow); east.setforeground(color.blue); east.setbackground(color.pink); south.setforeground(color.blue); south.setbackground(color.pink); west.setforeground(color.blue); west.setbackground(color.pink); north.setforeground(color.blue); north.setbackground(color.pink); center.setforeground(color.blue); center.setbackground(color.pink); settitle("visa BorderLayout"); setlayout(new BorderLayout(5, 10)); add("east", east); add("south", south); add("west", west); add("north", north); add("center", center); //constructor public static void main(string [] args) { JFrame f = new ShowBorderLayout(); f.setsize(400,200); f. //main //ShowBorderLayout Exempel från förra föreläsningen: public class Shoot1 extends JFrame { import private JTextField javax.swing.*; hfield = new JTextField(20); private JTextField vfield = new JTextField(20); private JLabel resultlabel = new JLabel(); public Shoot1() { public class MainShoot1 { JLabel hlabel = new JLabel("Ange utgångshastighet: "); hlabel.setbackground(color.pink); hlabel.setopaque(true); JFrame w = new Shoot1(); JLabel vlabel = new JLabel("Ange kastvinkel: "); //main vlabel.setbackground(color.orange); vlabel.setopaque(true); JPanel inputpanel = new JPanel(); inputpanel.setlayout(new GridLayout(2,2)); inputpanel.add(hlabel); inputpanel.add(hfield); inputpanel.add(vlabel); inputpanel.add(vfield); //MainShoot1 public class MainShoot1 { JFrame w = new Shoot1(); //main //MainShoot1 Observera att programmet inte är komplett, eftersom vi ännu inte har några lyssnare i programmet! resultlabel.setbackground(color.yellow); resultlabel.setforeground(color.magenta); resultlabel.setopaque(true); setlayout(new GridLayout(2,1)); add(inputpanel); add(resultlabel); pack(); //constructor //Shoot1 9 10 Händelsehantering 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. 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. 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. 11 12

ActionEvent och ActionListener 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: ActionEvent MouseEvent MouseMotionEvent KeyEvent ComponentEvent WindowEvent Vanliga händelser, som t ex att någon har tryckt på en knapp (JButton) Händelser med musen, som t ex att en musknapp har tryckts ned eller släppts När muspekaren har rört på sig Tangentbordshändelser. Man kan lyssna på när tangenter trycks ned och släpps upp samt när de faktiskt producerar ett tecken 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) Händelser för ett fönster, som t ex att det är på väg att stängas eller har ikonifierats 13 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 har en lyssnare, dvs att klassen innehåller metoden actionperformed. Detta görs genom att ange att klassen implementerar interfacet 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. 14 Komplettering av vårt tidigare exempel Fortsättning: lyssnare och callback-funktion import java.awt.event.*; public class Shoot extends JFrame implements ActionListener { private JTextField hfield = new JTextField(20); private JTextField vfield = new JTextField(20); private JLabel resultlabel = new JLabel(); public Shoot() { JLabel hlabel = new JLabel("Ange utgångshastighet: "); hlabel.setbackground(color.pink); hlabel.setopaque(true); JLabel vlabel = new JLabel("Ange kastvinkel: "); vlabel.setbackground(color.orange); vlabel.setopaque(true); hfield.addactionlistener(this); vfield.addactionlistener(this); JPanel input = new JPanel(); input.setlayout(new GridLayout(2,2)); input.add(hlabel); input.add(hfield); input.add(vlabel); input.add(vfield); Registrera lyssnare på komponenterna resultlabel.setbackground(color.yellow); resultlabel.setforeground(color.magenta); resultlabel.setopaque(true); setlayout(new GridLayout(2,1)); add(input); add(resultlabel); pack(); //constructor 15 if (e.getsource() == hfield e.getsource() == vfield) calculate(); //actionperformed public void calculate( ) { final double G = 9.81; String indata = hfield.gettext(); double v = Double.parseDouble(indata); indata = vfield.gettext(); double alfa = Double.parseDouble(indata); alfa = Math.toRadians(alfa); double h = (Math.pow(v, 2) * Math.pow(Math.sin(alfa), 2))/(2*G); double d = (Math.pow(v, 2) * Math.sin(2*alfa))/G; NumberFormat r = NumberFormat.getInstance(); resultlabel.settext(string.format("banhöjden är %.2f\n" + "och kastlängden är %.2f",h, d)); //calculate //Shoot public class MainShoot { JFrame w = new Shoot(); //main //MainShoot 16

Model-View-Controller (MVC) Model MVC-arkitekturen är en allmänt accepterad princip för program som använder grafiska gränssnitt. MVC-arkitekturen separerar de tre rollerna: Model (modell) den bakomliggande datastruktur som programmet bearbetar. View (vy) den visuella presentationen av modellen som användaren ser. Controller (styrfunktion) den klass som tar emot indata från användaren och utifrån detta först ber modellen och sedan vyn att uppdatera sig. public class Model { private double angle; private double speed; private static final double G = 9.81; public void setangle(double angle) { this.angle = angle; public void setspeed(double speed) { this.speed = speed; public double getheight() { return (Math.pow(speed, 2) * Math.pow(Math.sin(Math.toRadians(angle)), 2)) / (2*G); public double getdistance() { return (Math.pow(speed, 2) * Math.sin(2*Math.toRadians(angle))) / G; //Model 17 18 View public class GraphicalView extends JPanel { private JLabel resultatlabel = new JLabel(); private Model model; public GraphicalView(Model model) { resultatlabel.setbackground(color.yellow); resultatlabel.setforeground(color.magenta); resultatlabel.setopaque(true); add(resultatlabel); setbackground(color.yellow); //constructor public void showresult() { resultatlabel.settext(string.format("banhöjden är %.2f\noch kastlängden är %.2f", model.getheight(), model.getdistance())); //showresult //GraphicalView 19 Controller import java.awt.event.*; public class GraphicalController extends JPanel implements ActionListener { private JTextField hfield = new JTextField(20); private JTextField vfield = new JTextField(20); private Model model; private GraphicalView view; public GraphicalController(Model model, GraphicalView view) { this.view = view; JLabel hlabel = new JLabel("Ange utgångshastighet: "); hlabel.setbackground(color.pink); hlabel.setopaque(true); JLabel vlabel = new JLabel("Ange kastvinkel: "); vlabel.setbackground(color.orange); vlabel.setopaque(true); hfield.addactionlistener(this); vfield.addactionlistener(this); setlayout(new GridLayout(2,2)); add(hlabel); add(hfield); add(vlabel); add(vfield); //constructor if (e.getsource() == hfield) model.setspeed(double.parsedouble(hfield.gettext())); else if (e.getsource() == vfield) model.setangle(double.parsedouble(vfield.gettext())); view.showresult(); //actionperformed //GraphicalController 20

Sammankoppling av komponenterna public class GraphicalWindow extends JFrame { public GraphicalWindow() { Model model = new Model(); GraphicalView view = new GraphicalView(model); GraphicalController controller = new GraphicalController(model, view); setlayout(new GridLayout(2,1)); add(controller); add(view); pack(); setdefaultcloseoperation(jframe.exit_on_close); //konstruktor //GraphicGraphical public class MainMVC { JFrame w = new GraphicalWindow(); //main //MainMVC Ett exempel till Antag att vi har en klass GraphicDie som definierar en grafisk tärning. I klassen finns bl.a följande metoder: GraphicDie() GraphicDie(int dots) roll() int getvalue() 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 samt hur många kast som gjorts och den sammanlagda summan av dessa kast (enligt figuren nedan). 21 22 Implementation: MVC-implementation: Model import java.awt.event.*; public class TestDie extends JFrame implements ActionListener { private JButton tossbutton = new JButton("KASTA"); private GraphicDie thedie = new GraphicDie(); private JTextArea textlabel = new JTextArea(); private int nrofthrows = 0; private int sum = 0; public TestDie() { setlayout(new GridLayout(3,1)); add(thedie); add(textlabel); textlabel.setbackground(color.white); textlabel.setenabled(false); tossbutton.addactionlistener(this); add(tossbutton); //construktor if (e.getsource() == tossbutton) { thedie.roll(); thedie.repaint(); nrofthrows = nrofthrows + 1; int dots = thedie.getvalue(); sum = sum + dots; textlabel.settext("poäng: " + dots + "\nantal kast: " + nrofthrows + "\ntotal summa: " + sum); //actionperformed public static void main(string [] args) { TestDie td = new TestDie(); td.setsize(300, 300); td. //main //TestDie public class DieModel { private int value; private int sum; private int nrofthrows; public DieModel() { value = 0; sum = 0; nrofthrows = 0; public int getvalue() { return value; public int getsum() { return sum; public void update(int value) { this.value = value; sum = sum + value; nrofthrows = nrofthrows + 1; public int getnrofthrows() { return nrofthrows; //DieModel 23 24

MVC-implementation: View MVC-implementation: Controller public class DieView extends JTextArea { private DieModel model; public DieView(DieModel model) { setenabled(false); setfont(new Font("SansSerif", Font.BOLD,18)); public void update() { settext("tärningspoängen: " + model.getvalue() + "\n Antal kast: " + model.getnrofthrows() + "\ntotal summa: " + model.getsum()); //DieView import java.awt.event.*; public class DieController extends JButton implements ActionListener { private GraphicDie thedie; private DieModel model; private DieView view; public DieController(DieModel model, DieView view, GraphicDie thedie) { this.view = view; this.thedie = thedie; addactionlistener(this); settext("kasta"); //constructor thedie.roll(); thedie.repaint(); model.update(thedie.getvalue()); view.update(); //actionperformed //DieController 25 26 MVC-implementation: Sammankoppling av komponenterna Allmänna tips public class TestDieWindow extends JFrame { public TestDieWindow() { DieModel model = new DieModel(); DieView view = new DieView(model); GraphicDie thedie = new GraphicDie(); DieController controller = new DieController(model, view, thedie); setlayout(new GridLayout(3,1)); add(thedie); add(view); add(controller); setsize(300, 300); //constructor JFrame w = new TestDieWindow(); //main //TestDieWindow 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 och framför allt online-dokumentation när man programmerar. 27 28