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

Relevanta dokument
Arvshierarki. Object. Bostadshus. Flerfamiljshus. Villa

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

Föreläsning 9. Arv Grafiska komponenter

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

Mer om grafiska komponenter. Händelsestyrda program

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

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

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

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

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

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

Föreläsning 5. Föreläsning 5. Klasser och objekt. Klasser och objekt. Klasser och objekt

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

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

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

Objektorienterad programmering med Java Swing. Programexempel. Swing och AWT AWT. = Abstract windowing toolkit

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

Föreläsning 5. Föreläsning 5

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

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

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

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

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

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

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Exempel på användning av arv: Geometriska figurer

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

Konstruktion av klasser med klasser

Föreläsning 4. Klasser och objekt

Klasshierarkier - repetition

Lösningsförslag. 1 Lösningsförslag. Uppgift 1

OOP Objekt-orienterad programmering

Enkla variabler kontra referensvariabel

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

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

Föreläsning 6. Mer om klasser och objekt. Enkla variabler kontra referensvariabel. Omslagsklassen Integer. Referensvariabler

Laboration 15 Grafiskt användargränssnitt

Rita Egna Bilder, Timer

OOP Objekt-orienterad programmering

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 )

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

OOP Objekt-orienterad programmering

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

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

Enkla variabler kontra referensvariabel

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Klasshierarkier. Klasser kan byggas på redan definierade klasser

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Design och konstruktion av grafiska gränssnitt

Arv och Grafiska Användargränssnitt

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

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

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

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

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

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

Design och konstruktion av grafiska gränssnitt

public class BoundedCounter {

Lab5 för prgmedcl04 Grafik

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

Java-concept och Swing. Swing low, sweet chariot

Lösningsförslag övning 2.

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

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

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

Arv, Grafiska användaregränssnitt och Inre klasser! Förelasning 12!! TDA540 Objektorienterad Programmering!

PROGRAMMERINGSTEKNIK TIN212

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

OOP Objekt-orienterad programmering

Design och konstruktion av grafiska gränssnitt

ID1004 Laboration 3, 5-6 November 2012

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

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

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass).

Grafiska komponenter.

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

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

Design och konstruktion av grafiska gränssnitt

TENTAMEN OOP

Föreläsning 13 Innehåll

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

Laboration 1: Figurer i hierarki

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objektorienterad Programmering (TDDC77)

Föreläsning 5-6 Innehåll

Lösningsförslag till tentamen

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

TENTAMEN OOP

Transkript:

Föreläsning 9 Arv Grafiska komponenter Föreläsning Arv 9 Arv Grafiska komponenter Arv Vi människor använder klassificering för att organisera vår tillvaro. Klassificering innebär att sammanföra likartade objekt inom en domän i olika delgrupper (klasser). Animal... Reptile Mammal... Primate Digest food Monkey Human Warm blooded 5 fingers Erect Vid klassificering erhålls en hierarki, Ett objekt som tillhör en viss nivå i hierarkin har alla egenskaper som objekten på högre nivå i hierarkin har (dessa egenskaper har redan definierats och ärvs). Varje nivå i hierarkin tillför nya egenskaper hos objekten. Ju längre ner i hierarkin, ju mer specialiserade objekt. Ett objekt som tillhör en viss nivå i hierarkin tillhör också alla högre nivåer (en människa är en primat, en primat är ett däggdjur, ett däggdjur är ett djur).

Arv I Java finns två konstruktioner för att bygga arvshierarkier: implementationsarv (extends) specifikationsarv (implements) Vid implementationsarv ärvs kod från en superklass. Vid specifikationsarv ärvs ingen kod utan enbart gränssnittet (dvs vilka publika metoder som klassen skall innehålla). Implementationsarv Implementationsarv är en grundläggande objektorienterad teknik för att organisera och återanvända klasser. Med implementationsarv kan man definiera en klass utgående från en redan existerande klass. Den nya klassen återanvänder den gamla klassens definitioner, men utökar den med nya definitioner. Den klass som ärver kallas subklass. Den klass som en subklass ärver ifrån kallas för superklass. Subklassen har en är-relation till sin superklass, "en bil är ett fordon", "en politiker är en person", "en elefant är ett djur", "en villa är ett hus". En subklass kan vara en superklass till en annan klass, dvs det går att bygga en arvshierarki. När man skapar en arvshierarki skall gemensamma egenskaper och beteenden ligga så "långt upp" som möjligt i hierarkin. Alla klasser är subklasser till klassen Object.

Implementationsarv Alla klasser (utom Object) är i grunden utökningar av klassen Object. När en klass utökar en annan så ärver den alla dess fält och metoder. En subklass utökar superklassen Klasser är del i en klasshierarki Object Hus Fabrikslokal public Bostadshus void setheight(double Flerfamiljshus height) { Villa Klass Rectangle public class Rectangle { private double width; //instansvariabel private double height; //instansvariabel public Rectangle() { width = 0; height = 0; public Rectangle(double width, double height) { this.width = width; this.height = height; public double getwidth() { return width; }//getwidth public double getheight() { return height; }//getheight public void setwidth(double width) { this.width = width; } //setwidth this.height = height; } //setheight Flerfamiljshus public double getarea() { return height * width; }//getarea public double getperimeter() { return 2 * (height + width); } //getperimeter public String tostring() { return "Width = " + width + "\nheight = " }//tostring På en tidigare föreläsning } //Rectangle implementerade vi en klass Rectangle för att avbilda rektanglar. public void setheight(double height) { this.height = height; } //setheight public double getarea() { return height * width; }//getarea public double getperimeter() { return 2 * (height + width); } //getperimeter public String tostring() { return "Width = " + width + "\nheight = " + height; }//tostring } //Rectangle

Arv I klassen Rectangle beskrivs en rektangel med en höjd och en bredd. I en tillämpning där vi hanterar rektanglar, behöver vi förutom höjden och bredden på rektanglarna även handha rektanglarnas färger. Klassen Rectangle uppfyller således inte våra behov, utan vi behöver en ny klass ColoredRectangle, som avbildar en rektangel mha höjd, bredd och färg. import java.awt.color; public class ColoredRectangle { private double width; private double height; private Color color; Klass ColoredRectangle public ColoredRectangle(double width, double height, Color color) { this.width = width; this.height = height; public void setwidth(double width) { this.color = color; this.width = width; } //setwidth public ColoredRectangle() { width = 0; height = 0; color = Color.RED; public double getwidth() { return width; }//getwidth public double getheight() { return height; }//getheight public Color getcolor() { return color; } //getcolor public void setwidth(double width) { this.width = width; } //setwidth public void setheight(double height) { this.height = height; } //setheight public void setcolort(color color) { this.color = color; } //setcolor public double getarea() { return height * width; }//getarea public double getperimeter() { return 2 * (height + width); } //getperimeter public String tostring() { return "Width = " + width + "\nheight = " + height Utveckla + "\ncolor klassen = " + ColoredRectangle color; från }//tostring "scratch. }//ColoredRectangle public void setheight(double height) { this.height = height; } //setheight public void setcolort(color color) { this.color = color; } //setcolor public double getarea() { return height * width; }//getarea public double getperimeter() { return 2 * (height + width); } //getperimeter public String tostring() { return "Width = " + width + "\nheight = " + height + "\ncolor = " + color; }//tostring }//ColoredRectangle Utveckla klassen ColoredRecta "scratch.

Implementationsarv I klassen ColoredRectangle finns mycket av den kod som också finns i klassen Rectangle: båda klasserna har instansvariablerna private double widh; private double height; båda klasserna har metoderna public double getwidth() public double getheight() public void setwidth(double width) public void getheight(double height) public double getarea() public double getperimeter() public String tostring() Skulle vi då kunnat utnyttjat koden som finns i klassen Rectangle när vi konstruerade klassen ColoredRectangle utan att skriva om koden igen så som vi gjorde i ovanstående implementation av klassen ovan? Svar: JA!! Vi skulle ha kunnat utnyttjat arvsmekanismen som finns i Java. Klass ColoredRectangle import java.awt.color; public class ColoredRectangle extends Rectangle { private Color color; public ColoredRectangle(double width, double height, Color color) { super(width, height); this.color = color; public ColoredRectangle() { super(); color = Color.RED; public Color getcolor() { return color; } //getcolor public void setcolort(color color) { this.color = color; } //setcolor @Override public String tostring() { return super.tostring() + "\ncolor = " + color; }//tostring }//ColoredRectangle Metoderna double getwidth() double getheight() void setwidth(double width) void getheight(double height) double getarea() double getperimeter() ärvs från klassen Rectangle. Konstruktorer ärvs inte. Konstruktorerna använder sig av konstruktorerna i superklassen. Metoden tostring överskyggas och nyttjar metoden tostring i superklassen.

Implementationsarv: super En subklass kan referera till sin direkta superklass med super används i subklassens konstruktorer för att anropa superklassens konstruktorer super(width, height); Om subklassens konstruktor gör anrop till superklassens konstruktor skall detta anrop ligga som första sats i konstruktorn. Gör inte subklassens konstruktor något anrop till superklassens konstruktor sker automatiskt anrop till superklassens default-konstruktor (konstruktorn utan parametrar): saknar superklassen helt konstruktorer propagerar anropet uppåt i klasshiearkin saknar superklassen default-konstruktor men har någon annan konstruktor uppkommer ett kompileringsfel. Implementationsarv För att ange att en subklass skall ärva från en annan klass används det reserverade ordet extends. public class ColoredRectangle extends Rectangle En subklass kan lägga till tillståndsvariabler och metoder: private Color color En subklass kan lägga till metoder: public Color getcolor() public void setcolor(color color) En metod i subklassen kan omdefiniera, eller överskugga, en metod i superklassen: public String tostring() { return super.tostring() + "\ncolor = " + color; } //roll Superklassens parameterlösa konstruktor anropas automatiskt innan satserna i den egna konstruktorn utförs om inget explicit anrop till en konstruktor görs.

Klassen Die Vi har tidigare använt en klass Die för att avbilda en 6-sidig tärning. Klassen har följande utseende: import java.util.random; public class Die { private int dots; private static Random dierandom = new Random(); public Die() { import roll(); java.util.random; public class Die public { class NoRepeatDie public extends int getvalue() Die { return dots; private public int Die(int dots; dots) public { NoRepeatDie() }//getdots { if (dots < 1 dots > 6) private static Random super(); throw new IllegalArgumentException(); dierandom = public new void Random(); roll() { else public this.dots Die() = { dots; roll(); public NoRepeatDie(int }//Diedots) { super(dots); public Die(int dots) { @Override if (dots < 1 dots > 6) public void roll() { throw new IllegalArgumentException(); int oldvalue = getvalue(); else do { this.dots = dots; super.roll(); } while }//Die Klassen (getvalue() NoRepeatDie == oldvalue); }//roll }//NoRepeatDie dots = dierandom.nextint(6) + 1; }//roll public int getvalue() { return dots; }//getdots Utgå från klassen Die och använd implementationsarv för att skapa skapa en ny klass NoRepeatDie för att avbilda en tärning som aldrig ger samma värde för två på varandra följande kast. public class NoRepeatDie extends Die { public NoRepeatDie() { super(); public NoRepeatDie(int dots) { super(dots); @Override public void roll() { int oldvalue = getvalue(); do { super.roll(); } while (getvalue() == oldvalue); }//roll }//NoRepeatDie public void roll() { dots = dierandom.nextint(6) }//roll

Synlighetsmodifierare När man säger att en subklass ärver all data och alla metoder från sin superklass, betyder nödvändigtvis inte detta att subklassen direkt kan få access till all data och alla metoder i superklassen. I Java finns fyra olika synlighetsmodifierare: public protected utelämnad private tillåter access för alla andra klasser. tillåter access för alla andra klasser i samma paket och för subklasser i andra paket. tillåter access för alla andra klasser i samma paket. tillåter access endast inom klassen själv. Räckvidden hos synlighetsmodifierarna public AClass somepackage private SomeClass someotherpackage SubClass1 SubClass2 SubClass2 BClass no modifier protected

import java.util.random; public class Die { private int dots; Klassen CheaterDie import private java.util.random; static dierandom = new Random(); public class... Die { }//Die import java.util.random; private protected int int public dots; dots; class CheaterDie extends Die { private protected static static private Random static dierandom random = new = Random(); new = new Random(); public CheaterDie() {... super(); }//Die import java.util.random; public public class void roll() CheaterDie { extends Die { if (random.nextint(2) == 1) private static Random random super.roll(); sannolikheten = new 50 Random(); procent. public else { CheaterDie() { do { super(); super.roll(); } while (getvalue()!= 6); } }//roll }//CheaterDie public void roll() { if (random.nextint(2) (randomdie.nextint(2) == 1) == 1) super.roll(); dots = dierandom.nextint(6) + 1; else { do dots { = 6; }//rollsuper.roll(); }//CheaterDie } while (getvalue()!= 6); } Klassen CheaterDie }//roll }//CheaterDie import java.util.random; public class Die { protected int dots; protected static Random dierandom = new Random();... }//Die public class CheaterDie extends Die { private static Random random = new Random(); public CheaterDie() { super(); public void roll() { if (randomdie.nextint(2) == 1) dots = dierandom.nextint(6) + 1; else dots = 6; }//roll }//CheaterDie Variablerna är private! heltal! Okända i subklasen Implementation av klassen CheaterDie, som avbildar en 6-sidig tärning med egenskapen att sidan 6 kommer upp med Implementation av klassen Cheate som avbildar en 6-sidig tärning me egenskapen att sidan 6 kommer up sannolikheten 50 procent. Implementation av klassen Cheate som avbildar en 6-sidig tärning me egenskapen att sidan 6 kommer up sannolikheten 50 procent. Variablerna är protected! heltal! Kända i subklasen Implementation av klassen CheaterDie, som avbildar en 6-sidig tärning med egenskapen att sidan 6 kommer upp med sannolikheten 50 procent.

Arv En referensvariabel som är av typen "referens till C" får referera till objekt som är av klassen C eller till objekt som är subklasser till C. C Operatorn instanceof kan användas för att avgöra om ett objekt är av en viss klass. public class TestDices { public static void main(string[] arg) { Die t1 = new Die(); Die t2 = new NoRepeatDie(); Die t3 = new CheaterDie(); public t1.roll(); class TestDices { t2.roll(); public t3.roll(); static void main(string[] arg) { t1 = Die t2; t1 = new Die(); if (t1 instanceof NoRepeatDie) System.out.println("Detta Die t2 = new NoRepeatDie(); är en specialtärning"); if (t3 Die instanceof t3 = CheaterDie) new CheaterDie(); System.out.println("Detta är en fusktärning!!"); }//main t1.roll(); }//TestDices t2.roll(); t3.roll(); t1 = t2; if (t1 instanceof NoRepeatDie) System.out.println("Detta är en specialtärning"); if (t3 instanceof CheaterDie) Arv: Sammanfattning System.out.println("Detta är en fusktärning!!"); }//main }//TestDices En subklass kan lägga till tillståndsvariabler och metoder. Superklassens parameterlösa konstruktor anropas automatiskt innan satserna i den egna konstruktorn utförs, om inget explicit anrop till en konstruktor görs. Den egna klassen refereras med this och superklassen refereras med super. Alla klasser betraktas som subklasser till klassen Object. En metod i subklassen kan omdefiniera - eller överskugga - en metod i superklassen. Företeelsen med överskuggade metoder kallas för polymorfism (mångformighet). Vid överskuggade metoder är det objektets klass som avgör vilken metod som avses. Mekanismen som handhar att rätt metod väljs kallas för dynamisk bindning.

Arv: Sammanfattning Saknas en metod i en klass används i stället första motsvarande metod högre upp i klasshierarkin. Vid överskuggning av en metod får tillgängligheten (public, protected, private) hos den nya metoden inte vara lägre än tillgängligheten hos den överskuggade metoden. Vid överskuggning av en metod måste den nya metoden ha samma returtyp som originalet. (Signaturen hos metoderna är naturligtvis också lika, annars är det inte överskuggning utan överlagring.) En subklass når inte attribut i superklassen som är private. En referensvariabel som är av typen "referens till C" får referera till objekt som är av klassen C eller till objekt som är subklasser till C. Operatorn instanceof kan användas för att avgöra om ett objekt är av en viss klass. Grafiska användargränssnitt (GUIs) Användningen av fönstersystem har gjort att tekniken för att göra in- och utmatning till program har förändrats. Istället för textbaserad inmatning via tangentbordet sker inmatningen med hjälp av grafiska användargränssnitt, dvs användning av dialogboxar, ifyllande av blanketter, klicka med musen osv. Istället för textbaserad utmatning sker utmatningen ofta i form av grafiska presentationer.

Grafiska användargränssnitt (GUIs) Användning av grafiska användargränssnitt förändrar principerna för att skriva program. I traditionella textbaserade program gäller att - programmet styr vilka programsegment som skall exekveras och i vilken ordning detta skall ske - inläsningen av indata är programstyrd, dvs programmet avgör när indata skall läsas och vilken indatasekvens som skall läsas. GUI-program är "händelsestyrda". För händelsestyrda program gäller att - indata som ges till programmet (dvs en händelse som inträffar i det grafiska användargränssnittet) bestämmer vilka programsegment som exekveras. Händelsestyrt program

Grafiska användargränssnitt (GUIs) Java har bra stöd för grafiska användargränssnitt tack vare standardbiblioteken AWT (Abstract Windowing Toolkit) och Swing. I de första versionerna av Java fanns enbart AWT. Swing är både ett komplement och en ersättning för AWT. Swing bygger på AWT och har definierat om eller byggt ut vissa klasser, medan andra klasser används direkt som de är i AWT. AWT Swing + AWT AWT finns i paketet java.awt och Swing finns i paketet javax.swing. Grafiska användargränssnitt (GUIs) Swing är en verktygslåda som är till hjälp när man skriver program som har ett fönsterbaserat användargränssnitt. Swing består av många delar och en grov uppdelning kan göras på följande sätt: Grundläggande grafik: Linjer, cirklar, rektanglar etc. Grundläggande komponenter: Textfält, knappar, listor etc. Behållare: Komponenter som kan innehålla andra komponenter. Layouthantering: Bestämmer hur olika komponenter skall placeras ut i förhållande till varandra. Händelsehantering: Hur olika händelser skall hanteras. Avancerade komponenter: Fildialoger, tabeller, träd, editorer etc. Look-and-feel: Övergripande inställningar som gäller för alla komponenter.

Grafiska användargränssnitt (GUIs) De flesta fönstermiljöprogram har ett användargränssnitt som är uppbyggt av komponenter som var och en för sig har en viss uppgift. En välskriven komponent har en väldefinierad och lättolkad uppgift, och är lätt att återanvända och kombinera med andra komponenter. Komponenter kan vara väldigt enkla, t.ex en knapp, eller mer komplicerade, som en fildialog. Det är viktigt att komponenter har ett konsekvent programmeringsgränssnitt, både för att förenkla programmeringen av de enskilda komponenterna, men också för att det skall vara enkelt att kombinera dem. Komponentklasser i Swing Object Klasser i java.awt Color Graphics Component FontMetrics Font Dimension Container LayoutManager JComponent Window Panel Frame Dialog Apple JWindow JFrame JDialog JApple Klasser i javax.swing

Subklasser till JComponent JComponent JPopupMenue JProgressBar JInternalFrame JLabel JList JComboBox JTextComponent JTextField JSeparator JMenueBar JTextArea JEditorPane JToolBar JPanel JPasswordField JToolTip JOptionPane JSlider JScrollBar JSplitPane JLayeredPane JScrollPane JFileChooser AbstractButton JTable JTableHeader JRootPane JToggleButton JButton JMenuItem JTree JPane JRadioButton JCheckBox JMenu JColorChooser JTabbedPane JCheckBoxMenuItem JRadioButtonMenuItem Grafiska användargränssnitt (GUIs) I laboration 1 skrev ni ett program som läste in en utgångshastighet och en kastvinkel, och från dessa värden beräknade banhöjd och kastlängd. I laborationen gjordes inläsningen i två separata dialogrutor och resultatet presenterades i en tredje dialogruta: Ett mer överskådligt och lättanvänt (samt möjligen snyggare) användargränssnitt skulle kunna se ut enligt nedan:

Första delen i att bygga detta gränssnitt (se nästa sida vad vi får): import javax.swing.*; import java.awt.*; public class Shoot1 extends JFrame { private JTextField hfield = new JTextField(20); private JTextField vfield = new JTextField(20); private JLabel resultlabel = new JLabel(); import javax.swing.*; public Shoot1() { JLabel hlabel public = new JLabel("Ange class utgångshastighet: Main { "); hlabel.setbackground(color.pink); hlabel.setopaque(true); JLabel vlabel = new JLabel("Ange kastvinkel: "); vlabel.setbackground(color.orange); vlabel.setopaque(true); JPanel inputpanel }//main = new JPanel(); inputpanel.setlayout(new GridLayout(2,2)); inputpanel.add(hlabel); }//Main inputpanel.add(hfield); inputpanel.add(vlabel); inputpanel.add(vfield); Observera att programmet inte är komplett, eftersom vi ännu inte har några lyssnare i programmet! public static void main(string[] args) { JFrame w = new Shoot1(); resultlabel.setbackground(color.yellow); resultlabel.setforeground(color.magenta); resultlabel.setopaque(true); setlayout(new GridLayout(2,1)); add(inputpanel); add(resultlabel); pack(); setvisible(true); setdefaultcloseoperation(exit_on_close); } //Shoot1 Om vi nu skriver ett huvudprogram som skapar ett objekt av klassen Kast1 enligt: import javax.swing.*; public class Main { public static void main(string[] args) { JFrame w = new Shoot1(); }//main }//Main får vi ett fönster med följande utseende:

Fönstret är uppbyggt på följande sätt: Komponenterna hlabel, hfield, vlabel och vfield Panelen frågepanel. Komponenten resultatslabel. Själva fönstret, det ursprungliga JFrame-objektet som ärvs. Slutligt utseende av det JFrame-objektet när alla komponenter är utplacerade. Klassen javax.swing.jcomponent JComponent är basklassen för alla grafiska komponenter i Swing (med ett par undantag). JComponent är en abstrakt klass som innehåller metoder som är tillämpliga på alla grafiska komponenter. JComponent utökar java.awt.container som är en AWT-klass för komponenter som kan innehålla andra komponenter. Det innebär att (i princip) alla Swing-komponenter kan innehålla andra komponenter. JComponent utökar java.awt.container, vilket innebär att allting som går att göra med en AWT-komponent går också att göra med en Swingkomponent.

Klassen javax.swing.jcomponent Metoderna som kan användas på alla Swing-komponenter kan delas upp enligt vad de har att göra med: Komponentens utseende (färg, font, markör etc) Komponentens placering/storlek Ritning av komponenten Komponentens tillstånd (om den är visad/gömd, aktiverad/avaktiverad etc) Komponentens fokus (kan den fokuseras? vad är nästa fokuskomponent?) Om komponenten skall ha en ram eller inte. Om komponenten skall ha en beskrivande text som visas när muspekaren är över komponenten. Klassen JLabel Ett objekt av klassen JLabel visar en enkel text. Textens innehåll kan ändras av programmet, däremot kan den som använder programmet inte ändra texten. I ett JLabel-objekt kan texten kombineras med en bild. Det finns metoder för att t.ex. kunna ändra texten och bilden i ett JLabel-objekt, göra objektet synligt eller osynligt samt kunna placera texten/bilden på olika ställen på objektet. Vidare finns metoder för att sätta bakgrunds- och förgrundsfärg på objektet, förse objektet med olika slag av ramar samt ange utseendet på texten. Vissa av dessa metoder finns i klassen JLabel, andra metoder ärvs från superklasserna JComponent och Container.

Exempel på metoder i klassen JLabel JLabel label1 = new JLabel(); JLabel label2 = new JLabel("Some text"); JLabel label3 = new JLabel("A piture and some text", new ImageIcon("work.gif"), JLabel.CENTER); label1.settext("detta är en text"); label1.seticon(new ImageIcon("figur.gif")); label1.setvisible(false); label2.setbackground(color.yellow); label2.setforeground(color.blue); label2.setfont(new Font("SansSerif", Font.BOLD,14)); label2.setborder(new LineBorder(Color.RED, 5)); label2.setopaque(true); label3.setbackground(color.pink); label3.setforeground(color.red); label3.setfont(new Font("Serif", Font.ITALIC, 20)); label3.setborder(new TitledBorder("Rubrik på ramen")); label3.setopaque(true); String str = label2.gettext(); Icon bild = label2.geticon(); För JLabel-objekt gäller som standard att de är genomskinliga. Därför syns t.ex. inte bakgrundsfärgen. För att bakgrundsfärgen skall synas måste vi anropa metoden setopaque(true). Klassen JButton Klassen JButton beskriver en knapp som användaren kan klicka på. Ett objekt av klassen JButton kan innehålla en text och/eller en bild. Det finns metoder för att t.ex. kunna ändra knappens utseende när man trycker på den, göra knappen synlig eller osynlig, göra knappen åtkomlig eller icke åtkomlig samt för att placera texten/bilden på olika ställen på knappen. Vissa av dessa metoder finns i klassen JButton, andra metoder ärvs från superklasserna JComponent och Container.

Exempel på metoder för klassen JButton JButton button1 = new JButton(); JButton button2 = new JButton("Some text"); JButton button3 = new JButton("A piture and some text", new ImageIcon("work.gif")); button1.settext("detta är en text"); button1.seticon(new ImageIcon("figur.gif")); button1.addactionlistener(this); button1.setvisible(false); button2.setbackground(color.yellow); button2.setforeground(color.blue); button2.setfont(new Font("SansSerif", Font.BOLD,14)); button2.setborder(new LineBorder(Color.RED, 5)); button2.addactionlistener(this); button2.setenabled(false); button3.setbackground(color.pink); button3.setforeground(color.red); button3.setfont(new Font("Serif", Font.ITALIC, 20)); button3.setborder(new TitledBorder("Rubrik på ramen")); button3.addactionlistener(this); String str = button2.gettext(); Icon bild = button2.geticon(); Klassen JTextField och JTextArea Klassen JTextField används för att skapa objekt för kunna göra enklare inläsning av data. I ett JTextField-objekt sker inmatningen från en inmatningsrad. Klassen JTextArea används för att skapa objekt som används vid mer avancerad inmatning där indata behöver läsas från flera inmatningsrader. Det finns metoder för att t.ex. läsa den text som finns i ett ett JTextFieldobjekt och ett JTextArea-objekt, göra objektet synligt eller osynligt och ändra storleken på objektet. Vidare finns metoder för att sätta bakgrunds- och förgrundsfärg på objektet, förse objektet med olika slag av ramar samt ange utseendet på texten. Vissa av dessa metoder finns i klassen JTextField (resp JTextArea), andra metoder ärvs från superklasserna JComponent och Container.

Exempel på metoder för klassen JTextField JTextField textf1 = new JTextField(); JTextField textf2 = new JTextField(20); JTextField textf3 = new JTextField("Some text"); JTextField textf4 = new JTextField("Some text", 20); textf1.settext("detta är en text"); textf1.addactionlistener(this); textf1.setvisible(false); textf2.setbackground(color.yellow); textf2.setforeground(color.blue); textf2.setfont(new Font("SansSerif", Font.BOLD,14)); textf2.setborder(new LineBorder(Color.RED, 5)); textf2.addactionlistener(this); textf2.setenabled(false); textf3.setbackground(color.pink); textf3.setforeground(color.red); textf2.setfont(new Font("Serif", Font.ITALIC, 20)); textf3.setborder(new TitledBorder("Rubrik på ramen")); textf3.addactionlistener(this); String str1 = textf1.gettext(); String str2 = textf1.getselectedtext(); Klassen JPanel Det finns en särskilt viktig sorts komponenter, nämligen de som kan innehålla andra komponenter. Dessa komponenter används för att kunna gruppera komponenter till mer komplicerade strukturer. Komponenter som kan innehålla andra komponenter kallas ofta för behållare (eng containers) och är subklasser till klassen Container. Den vanligaste komponenten för att gruppera andra komponenter i är JPanel. Den har alla de egenskaper som vanliga komponenter har, men dessutom kan man säga åt den att innehålla andra komponenter med metoden add: JPanel p = new JPanel(); p.add(annan komponent);

Klassen JPanel En JPanel kan innehålla vilka andra komponenter som helst, även andra JPanel-komponenter. På så vis bildas det en trädstruktur med komponenter inuti andra komponenter osv. Hur de olika komponenterna läggs ut bestäms av vilken LayoutManager som används. JPanel p = new JPanel(); JPanel p2 = new JPanel(); JButton go = new JButton(); JButton press = new JButton(); JLabel result = new JLabel(); JLabel text = new Jlabel();... p.add(go); p.add(result); p.add(p2); p2.add(press); p2.add(text);... Exempel på metoder för klassen JPanel JPanel panel1 = new JPanel(); JPanel panel2 = new JPanel(new FlowLayout(10)); panel1.setlayout(new GridLayout(1, 2, 10, 10)); panel1.setvisible(true); panel1.setbackground(color.yellow); panel1.setborder(new LineBorder(Color.RED, 5)); panel2.setbackground(color.pink); panel2.setborder(new TitledBorder("Rubrik på ramen")); panel1.add(new JButton("Go!")); panel1.add(new JLabel("Resultat:")); panel1.add(panel2); panel2.add(new JLabel("Some text")); panel2.add(new JButton("Press Here!")); panel1.setvisible(true); panel2.setsize(100,200); int w = panel2.getwidth(); int h = panel2.getheight();

Klassen JFrame JFrame är huvudfönstret som alla andra komponenter ligger i. Fönstret har flera olika delar, som t ex en menyrad, fönstrets kant, huvudytan osv. Huvudytan kommer man åt med metoden getcontentpane som returnerar en Container. import java.awt.*; import javax.swing.*; public class TestFrame extends JFrame { public TestFrame() { setlayout(new GridLayout(1, 2, 20,20)); getcontentpane().setbackground(color.pink); import add(new java.awt.*; JButton("Press here")); add(new JLabel("Some text")); import javax.swing.*; setdefaultcloseoperation(exit_on_close); public }//konstruktor class TestFrame extends JFrame { public static void main(string[] arg) { public JFrame TestFrame() tf = new TestFrame(); { setlayout(new tf.setsize(350, 100); GridLayout(1, 2, 20,20)); tf.setvisible(true); }//main getcontentpane().setbackground(color.pink); }//TestFrame add(new JButton("Press here")); add(new JLabel("Some text")); setdefaultcloseoperation(exit_on_close); }//konstruktor public static void main(string[] arg) { JFrame tf = new TestFrame(); tf.setsize(350, 100); tf.setvisible(true); }//main }//TestFrame Utelämnas getcontentpane blir inte fönstret rosa