Vad är ett Framework? 2203$ ) UHOlVQLQJ. Hollywood. Frameworks (FW) Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java

Relevanta dokument
Frames, menyer och GUI-program

5 Användargränssnitt. 5.1 AWT och Swing

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

Grafiska komponenter.

Händelsestyrda program

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

Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets

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

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

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

DOA GUI-del 1. Java och enkla grafiska gränssnitt. Kodexempel. Steg för steg 1. Skapa fönster. 1. Skapa fönster. 2. Skapa knapp

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

Java-concept och Swing. Swing low, sweet chariot

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

0HURP'DOJRULWPHU-DYDOD\RXW GXEEHOEXIIULQJPP ) UHOlVQLQJ. ,QQHKnOO

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

Lab5 för prgmedcl04 Grafik

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

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

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

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

GUI-programmering. Gustav Taxén Martin Berglund DH2640 Grafik och Interaktionsprogrammering VT 2008

Laboration 15 Grafiskt användargränssnitt

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

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

Mer om grafiska komponenter. Händelsestyrda program

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

Fönstersystem. Objektorientering och händelsebaserad programmering. Applikation. Interaktionstoolkit. Händelsehanterare och grafiktoolkit

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

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

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

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

OOP Objekt-orienterad programmering

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

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

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

Tentamen FYTA11 Javaprogrammering

Grafiska användargränssnitt i Java

Programstyrd / händelsestyrd

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.

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

OOP Objekt-orienterad programmering

Grafiska användargränssnitt i Java

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

Lektion Händelsehanterare

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin Micael Karlsson

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

Laboration 3 GUI-programmering

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

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

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

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

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

Grafiska användargränssnitt i Java

Omentamen FYTA11 Javaprogrammering

Utmatningstekniker Vektoriserade (linjeritande) skärmar

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

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

Objektorienterad programmering i Java. Föreläsning 5 Kort om Java-Applets

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

DOA Konstruktion av gränssnitt 5 april 2004 av Björn Eiderbäck

Lösningsförslag till tentamen FYTA11 Javaprogrammering

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Grafiska användargränssnitt, forts

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

GUI Nyckelbeståndsdelar

FactoryCast HMI. Premium & Quantum PLC. Applets

För att hitta filen gå till mappen NetBeansProjects. Välj undermappen med rätt projekt, och sedan undermapp dist. Där ligger.jar-filen.

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

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Arv och Grafiska Användargränssnitt

Laboration 4: Game of Life

Projekt 2 XL. Observer-mönstret

ID1004 Laboration 3, 5-6 November 2012

Applets med komponenter

Grafiska användargränssnitt i Java

Labbinstruktioner för Java/Swing

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Lite logik. Kap 6: Sid 2

Klasshierarkier. Klasser kan byggas på redan definierade klasser

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

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

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

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

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

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

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

Ingenjörsfirman Stéen Java Sida 1 av 1

Lösningsförslag tentamen FYTA11 Java

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

Klassen javax.swing.timer

Rita Egna Bilder, Timer

Fönsterhantering, grafik

Konstruktion av klasser med klasser

Transkript:

2203$ ) UHOlVQLQJ Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java Innehåll, kort om: Frameworks Grafik med främst AWT Grafiska interaktiva applikationer Händelsehantering Vad är ett Framework? Ett framework (FW) beskriver hur ett problem skall brytas ner Ett FW beskriver inte bara hur klasserna utan också hur deras instanser samverkar definierar invarianter som objekten måste dela anger också hur dom skall användas Ett FW består typiskt av en uppsättning abstrakta klasser och gränssnitt som beskriver en semikomplett applikation som sedan specialiceras för att konstruera konkreta applikationer Ett framework påtvingar en modell som programmeraren måste anpassa sig till Dom flesta FW använder designmönster som Template Method och Strategy previous next previous next 3 Frameworks (FW) Ett FW är centralt för konstruktion av tex interaktiva grafiska applikationer Varför ett framework? svårt att tränga in i toolkits, eller följa givna designregler Hollywood Omvänd kontroll Ibland talar man om Hollywood-principen i ett framework Ring inte oss vi ringer er! återanvändbar applikationsdesign eller delsystem representeras av ett antal abstrakta klasser och definitioner av hur dessa klasser samarbetar, vilket vägleder programutvecklaren och gör det enklare att konstruera enhetliga gränssnitt och applikationer snabbare mer uniformt Koda med klassbibliotek Användarkod kod i klassbibliotek Koda med framework Framework användarkod previous next 2 previous next 4 Björn Eiderbäck 1999-2000 1 Björn Eiderbäck 1999-2000 2

Exempel på Frameworks i Java Collection Framework För mängdhantering Se Collection-klasserna i Javas tutorial, http://java.sun.com/docs/books/tutorial/collections/index.html Framework för grafiska gränssnitt Med bla AWT, Swing mm Se resten av OH-bilderna + Javas tutorial, (Swing) http://java.sun.com/docs/books/tutorial/uiswing/index.html Graphics http://java.sun.com/docs/books/tutorial/2d/index.html Några viktiga klasser i java.awt java.awt java.lang Applet Button List Panel Label ScrollPane Dialog Object Component Container Window Frame TextArea java.applet Input/output Framework Strömmar med in- och utmaning Se http://java.sun.com/docs/books/tutorial/essential/io/index.html TextComponent TextField previous next 5 previous next 7 Javas API (Application Programming Interface) Java:s API innehåller bla awt (abstract windowing toolkit) som delvis kan användas som ett Framework som bla stödjer konstruktion av applikationer med fönster Den fundamentala klassen Frame subklassas beteendet ändras, dvs anpassas till dom egna önskemålen, genom att lämpliga metoder skrivs om i den konkreta (egna) subklassen Skapa fönster public class FrameHelloFirst extends Frame { public static void main(string [] args) { FrameHelloFirst frame = new FrameHelloFirst(); frame.setsize(200, 300); //Fönstrets storlek frame.setvisible(true); //Öppna fönstret previous next 6 previous next 8 Björn Eiderbäck 1999-2000 3 Björn Eiderbäck 1999-2000 4

Olika sätt att skapa fönster Använd klassen Frame Vi skapar en klass som använder en Frame för att skapa ett fönster import java.awt.frame; public class Frame1 { public static void main(string args []) { // skapa ett fönster med given titel Frame frame = new Frame("Frame 1"); frame.setsize(300, 400); // fönstrets storlek frame.setvisible(true); // öppna fönstret Definiera utritning Använd "subklass-strategin Skriv över metoden paint(graphics g) Dvs skriv public void paint(graphics g) { // använd g för att rita metoden anropas automatiskt då fönstret behöver ritas om previous next 9 previous next 11 Alternativt kan vi konstruera subklass till Frame public class Frame2 extends Frame { /* om vi vill använda konstruktören med argument måste vi skapa motsvarande konstruktör i den egna klassen */ public Frame2(String s) { super(s); Rita text på fönstret Använd metoden drawstring(string str, int x, int y) i klassen Graphics public void paint(graphics g) { // vi skriver ut fönstrets höjd System.out.println(getHeight()); g.drawstring("här kommer en sträng halvägs ner i y-led", 20, //x-koordinat getheight() / 2); //y-koordinat previous next 10 previous next 12 Björn Eiderbäck 1999-2000 5 Björn Eiderbäck 1999-2000 6

En rutin för att rita lite olika grafik public void paint(graphics g) { int posy; posy = getbounds().height / 3; g.drawstring("man kan 'rita' ut text", 20, posy); //Färg g.setcolor(color.blue); posy = posy + 30; g.drawstring("man kan ändra färgen (och rita figurer)", 20, posy); g.setcolor(color.red); g.drawline(10, 10, 100, posy); g.setcolor(new Color((float) 0.5, (float) 1.0, (float) 0.7)); g.fill3drect(posy, posy, posy + 50, posy + 70, true); previous next 13 och ändra i Frameklassen public class FrameHelloFourth extends Frame { Ball [] thefigures = { new Ball(Color.red, new Point(70, 70), 50), new Ball(Color.blue, new Point(75, 170), 70); public static void main(string [] args) { FrameHelloFourth frame = new FrameHelloFourth(); frame.setsize(200, 300); frame.setlocation(new Point(100, 150)); frame.settitle("med två bollar"); frame.setvisible(true); frame.addwindowlistener(new MyWindowListener()); public void paint(graphics g) { for(int i = 0; i < thefigures.length; i++) { thefigures[i].paint(g); previous next 15 Ett objekt som själv ritar på skärmen public class Ball { Color mycolor; Point position; int radius; public Ball(Color acolor, Point aposition, int aradius) { mycolor = acolor; position = aposition; radius = aradius; public void paint(graphics g) { g.setcolor(mycolor); g.filloval(position.x - radius, position.y - radius, 2 * radius, 2*radius); Vad kan jag rita i Java? I Java 1.1 är ritrutinerna ganska primitiva Man kan endast rita objekt med tjocklek 1 (ett) rita enklare typer av primitiva objekt hantera pixelkartor på ett begränsat sätt Man kan också använda tex färg och sätta klipprektangel I Java 2 (JDK 1.2 och senare) med Java2D har vi fler möjligheter som tex rita splines och andra kurvor ange tjocklek på kanter ange typ av linje (tex rita streckad linjer mm) ange transformationer som skalning, translation och rotation rita genomskinligt eller ange att antialiasing skall användas Idag tittar vi lite på Java 1.1 och den intresserade kan titta på Java 2 på SUNs sidor previous next 14 previous next 16 Björn Eiderbäck 1999-2000 7 Björn Eiderbäck 1999-2000 8

Rita ickefyllda grafiska objekt Några exempel linje gc.drawline(int x1, int y1, int x2, int y2); oval gc.drawoval(int x, int y, int width, int height); rektangel gc.drawrect(int x, int y, int width, int height); polygon gc.drawpolyline(int xpoints[], int ypoints[], int npoints); alternativt gc.drawpolygon(polygon p); Rita med olika färg ändra färg gc.setcolor(color c) rita med XOR-mod, dvs alternera mellan den grafiska kontextens färg och den som ges som argument till metoden gc.setxormode(color c1) previous next 17 previous next 19 Rita fyllda grafiska objekt oval gc.filloval(int x, int y, int width, int height); rektangel gc.fillrect(int x, int y, int width, int height); polygon gc.fillpolygon(int[] xpoints, int[] ypoints, int npoints) eller gc.fillpolygon(polygon p) Rita bilder Hämta bild från fil (från en Frame måste vi använda gettoolkit, från en applet behövs inte detta) Image image = gettoolkit().getimage(imagefile); Rita bilden på grafiska kontexten (skalad att passa in i given rektangel) gr.drawimage(image, posx, posy, width, height, bgcol, this); previous next 18 previous next 20 Björn Eiderbäck 1999-2000 9 Björn Eiderbäck 1999-2000 10

Inmatning i Java Händelsestyrd inmatning Förändringar hos enheter placeras i en kö intresserade program meddelas om att händelse inträffat från början av kön (flera kan alltså meddelas om samma händelse) Händelselyssnare Händelser till en grafisk applikation tas omhand av händelselyssnare Olika typer av lyssnare tar hand om olika typer av händelser Till varje lyssnare finns ett speciellt interface som beskriver vilka metoder som lyssnaren implementerar Det är sedan upp till varje program att själv bestämma hur det skall (eller inte skall) reagera Exempel, en metod som reagerar om händelsen dubbeklick inträffar public void doubleclickevent(event event) { frame.setlocation(event.position()); Lyssnarna och deras interface tillhör ett gemensamt package nämligen: java.awt.event previous next 21 previous next 23 Java 1.1s händelsemodell Java 1.1. och senare baseras på en modell där händelser i gränssnitten tas om hand av "lyssnare" I princip sätter man upp en händelselyssnare per typ (tangentbord, mus, fokus, etc.) av händelse man är intresserad av i applikationen Varje komponent (knapp, fält, mfl) kan också hanteras av sin egen händelselyssnare buttonx.addactionlistener(mylistenerforbuttonx) Med fördel används anonyma klasser för att definiera lyssnare för olika objekt Inre klasser I Java kan man deklarera inre klasser på i princip tre sätt Toppnivåklass public class A { // private B test = new B(); // class B { //.. Nästlad medlemsklass public class A { // class B { //.. private B test = new B(); // previous next 22 previous next 24 Björn Eiderbäck 1999-2000 11 Björn Eiderbäck 1999-2000 12

Inre klasser Anonym klass public class A { // Adapter myadapter = new Adapter() //Här skapas en anonym subklass till Adapter { public void adapt(event e) { // metoden skriver över superklassen Adapter:s // version av adapt(event e) ; // this.addadapter(myadapter); och den inre klassen class MyWindowListener implements WindowListener { public void windowopened(windowevent e) { public void windowclosing(windowevent e) { System.exit(0); public void windowclosed(windowevent e) { public void windowiconified(windowevent e) { public void windowdeiconified(windowevent e) { public void windowactivated(windowevent e) { public void windowdeactivated(windowevent e) { previous next 25 previous next 27 Lyssna efter stängningshändelse (med inre klass) import java.awt.event.*; public class FrameHelloSecond extends Frame { public static void main(string [] args) { FrameHelloSecond frame = new FrameHelloSecond(); frame.setsize(200, 300); frame.setlocation(new Point(100, 150)); frame.settitle("the second one"); frame.setvisible(true); /* Vi är trötta på att stänga med CTRL-C så vi skriver följande */ frame.addwindowlistener(new MyWindowListener()); Vi deklarerar att vi implementerar rätt gränssnitt "Ritprogram" i Java 1.1 import java.awt.event.*; public class Scribble2 extends Frame implements MouseListener, MouseMotionListener { private int last_x = 0, last_y = 0; // koordinater public Scribble2(String s) { super(s); Vi lyssnar på både musknappar this.addmouselistener(this); och musrörelser this.addmousemotionlistener(this); previous next 26 previous next 28 Björn Eiderbäck 1999-2000 13 Björn Eiderbäck 1999-2000 14

Vi tar hand om mustryck Vi tar hand om musrörelser // En metod beskriven i MouseListener. // Anropas vid tryck på musknapp. public void mousepressed(mouseevent e) { last_x = e.getx(); last_y = e.gety(); // En metod beskriven i MouseMotionListener. // Anropas då musen dras runt med knapp nertryckt. public void mousedragged(mouseevent e) { Graphics g = this.getgraphics(); int x = e.getx(), y = e.gety(); g.drawline(last_x, last_y, x, y); last_x = x; last_y = y; previous next 29 Frame (och Applet) hur var det nu java.lang java.awt Ofta är det tillräckligt att (Java 1.1) subklassa Frame och implementera tex WindowListener, MouseListener och MouseMotionListener senare skall vi titta på hur vi istället kan använda adaptorer skriva public static void main(string args[]) java.applet Object Component Container Panel Applet Window Frame instansiera den egna klassen, ange fönsterstorlek och ange att fönster och mushändelser skall tas emot (addwindowlistener(this) osv), öppna det hela skriva public void paint(graphics g) rita på skärmen konstruera metoder för gränssnitt till "lyssnare" som vi angett att vi skall implementera previous next 31 Vi måste // Metoder deklarerade i MouseListener måste implementeras implementera hela lyssnaren // även om vi inte gör något i dem public void mousereleased(mouseevent e) {; public void mouseclicked(mouseevent e) {; public void mouseentered(mouseevent e) {; public void mouseexited(mouseevent e) {; // och samma sak för metoder från MouseMotionListener. public void mousemoved(mouseevent e) {; public static void main(string args []) { Scribble2 frame = new Scribble2("Scribble- Java 1.1 med lyssnare"); frame.setsize(200, 200); frame.setvisible(true); Mer om händelselyssnare Händelser till ett fönster eller komponent tas omhand av händelselyssnare Olika typer av lyssnare tar hand om olika typer av händelser, MouseListener, WindowListener, FocusListener, ActionListener, osv Namnet är uppbyggt på följande sätt: HändelsetypListener Till varje lyssnare finns ett speciellt interface som beskriver vilka metoder som lyssnaren implementerar Lyssnarna och deras interface tillhör ett gemensamt package nämligen: java.awt.event previous next 30 previous next 32 Björn Eiderbäck 1999-2000 15 Björn Eiderbäck 1999-2000 16

Händelselyssnare, några typiska Adaptorer KeyListener EventListener TextListener Object ComponentAdapter ActionListener ActionListener MouseListener ContainerAdapter AdjustmentListener ComponentListener ComponentListener MouseMotionListener FocusAdapter ContainerListener FocusListener ItemListener Klasser KeyAdapter FocusListener ItemListener Gränssnitt Gränssnitt WindowListener AdjustmentListener MouseAdapter KeyListener MouseMotionAdapter MouseListener ContainerListener WindowAdapter WindowListener MouseMotionListener TextListener previous next 33 previous next 35 Adaptorer och händelselyssnare För att förenkla användningen av händelselyssnare finns ett antal fördefinierade adaptorer Dessa adaptorer implementerar alla metoder deklarerade i den aktuella lyssnarens gränssnitt En adaptor implementerar endast tomma metoder Genom att subklassa en adaptor och använda den som lyssnare så räcker det att endast skriva om dom metoder som verkligen gör något, så slipper man som i föregående exempel implementera massa metoder utan metodkropp Dessa adaptorer är speciellt enkla att använda tillsammans med anonyma inre klasser previous next 34 Scribble med inre klasser och adaptorer import java.awt.event.*; /** Frame med anonyma inre klasser **/ public class Scribble4 extends Frame { int last_x, last_y; public void init() { // Definiera, instansiera och registrera en MouseListener this.addmouselistener(new MouseAdapter() { public void mousepressed(mouseevent e) { last_x = e.getx(); last_y = e.gety(); ); previous next 36 Björn Eiderbäck 1999-2000 17 Björn Eiderbäck 1999-2000 18

// Definiera, instansiera och registrera en MouseMotionListener this.addmousemotionlistener(new MouseMotionAdapter() { public void mousedragged(mouseevent e) { Graphics g = getgraphics(); int x = e.getx(), y = e.gety(); g.setcolor(color.blue); g.drawline(last_x, last_y, x, y); last_x = x; last_y = y; ); Klasshierarki AWT Object Component Container List Label Button Checkbox TextComponent Panel Window TextField TextArea Applet Dialog Frame previous next 37 previous next 39 // Konstruera en knapp Button b = new Button("Clear"); // Definiera en lyssnare som tar hand om tryck på knappen b.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { ); /* Rensa hela fönstret genom att rita en fylld rektangel i fönstrets storlek */ Graphics g = getgraphics(); g.setcolor(getbackground()); //Rita med bakgrundens färg g.fillrect(0, 0, getsize().width, getsize().height); // Lägg knappen i fönstret this.add(b); Grafiska komponenter Det finns flera olika typer av komponenter i Java Button Checkbox List Choice Label TextField TextArea Scrollbar För illustration och exempel se exempel: komponenter nedan sidan 35 previous next 38 previous next 40 Björn Eiderbäck 1999-2000 19 Björn Eiderbäck 1999-2000 20

Containers En container är en komponent som kan innehålla andra komponenter Ett objekt läggs in i containern med meddelandet add(component) Instanser av Panel brukar användas för att organisera komponenter på olika sätt inom appleten panel1 panel2 den här gången varierar vi oss och gör det som en applet, fast koden blir ungefär densamma som för en Frame. Mer detaljer om appletar nästa föreläsning (F15) import java.applet.*; public class DemoComponents extends Applet { private Button button; private Checkbox checkbox; private Label label; private List list; private Choice choice; private Scrollbar scrollbar; private TextField textfield; private TextArea textarea; previous next 41 previous next 43 Exempel: komponenter Ett test av att skapa olika typer av komponenter och låta det hela placeras automatiskt public void init() { super.init(); resize(300, 200); button = new Button("En knapp"); add(button); checkbox = new Checkbox("En checkbox"); add(checkbox); label = new Label("En label"); add(label); previous next 42 previous next 44 Björn Eiderbäck 1999-2000 21 Björn Eiderbäck 1999-2000 22

list = new List(); list.additem("list 1"); list.additem("list 2"); add(list); Layoutmanagers för att kontrollera placering av komponenter LayoutManager choice = new Choice(); choice.additem("a"); choice.additem("b"); add(choice); BorderLayout GridBagLayout scrollbar = new Scrollbar(); add(scrollbar); GridLayout FlowLayout CardLayout previous next 45 previous next 47 textfield = new TextField("Textfält"); add(textfield); textarea = new TextArea("Textruta", 4, 15); add(textarea); Skapa en HTML-fil och kör med en appletviewer eller nätbläddrare FlowLayout är default för Panelobjekt placerar komponenter från vänster till höger. Vid full rad så ny rad GridLayout ser till att alla komponenter har samma storlek. Rutnät (rad, kolumn) BorderLayout är default för Window-klasser (ex Frame och Dialog) Placerar komponenter i vädersträck CardLayout Placerar objekten i en kortlek där endast ett kort i taget synlikt GridBagLayout Mest generell (och komplex). Delar in ytan i flera celler. Använder restriktioner (eng. constraints) för att beskriva hur komponenter placeras samt deras utsträckning previous next 46 previous next 48 Björn Eiderbäck 1999-2000 23 Björn Eiderbäck 1999-2000 24

Exempel: Flowlayout import java.applet.*; public class DemoFlowlayout extends Applet { Button buttons[]; public void init() { super.init(); setlayout(new FlowLayout()); buttons = new Button[10]; for (int i = 0; i < 10; i++) { buttons[i] = new Button("Knapp " + i); add(buttons[i]); Exempel: Gridalyout public class DemoGridlayout extends Applet { Button buttons[]; public void init() { super.init(); setlayout(new GridLayout(5, 2)); buttons = new Button[10]; for (int i = 0; i < 10; i++) { buttons[i] = new Button("Knapp " + i); add(buttons[i]); previous next 49 previous next 51 Layouten följer med förändringar av fönsterstorlek Exempel: Borderlayout public class DemoBorderlayout extends Applet { public void init() { super.init(); resize(300, 400); setlayout(new BorderLayout()); add("north", new Button("Knapp " + "Norr")); add("south", new Button("Knapp " + "Söder")); add("east", new Button("Knapp " + "Öster")); add("west", new Button("Knapp " + "Väster")); add("center", new Button("Knapp " + "Centrum")); previous next 50 previous next 52 Björn Eiderbäck 1999-2000 25 Björn Eiderbäck 1999-2000 26

Metoder för att hantera komponenter förutom layout kan komponenter också bla visas eller döljas setvisible(boolean) göras aktiva eller passiva setenabled(boolean) omritas, ritas eller markeras som korrupta repaint(), paint(graphics), invalidate() layout kan anges för containerbaserade komponenter också fönster kan visas, läggas i för- eller bakgrunden, titel kan anges, mm show(), tofront(), toback() cursor kan ändras storlek kanges (tänk på layout null) Gridlayout Flowlayout protected void testlayoutes() { /* Lite urartat visar vi hur man kan fråga om komponenter. I det här fallet vet vi att det är en Container och "kastar" */ Container panel = (Container) this.getcomponents()[0]; int delaytime = 3000; delay(delaytime); panel.setlayout(new GridLayout(5, 4, 10, 20)); this.settitle("gridlayout"); this.validate(); delay(delaytime); panel.setlayout(new FlowLayout(FlowLayout.LEFT, 7, 7)); this.settitle("flowlayout"); this.validate(); previous next 53 previous next 55 Blandat exempel import java.awt.event.*; public class TestOfFrame extends Frame { public TestOfFrame(String s) { super(s); protected void delay(int ms) { // Vi måste ta hand om exceptions, vilket görs med ett try-catch-par try{ Thread.currentThread().sleep(ms); catch(exception e) { Ingen layout Component[] panelcomponents = panel.getcomponents(); for (int i = 0; i < panelcomponents.length; i++) { Component component = panelcomponents[i]; component.setbounds((i % 5) * 40, i * 25, 50, 20); delay(delaytime); panel.setlayout(null); this.settitle("null layout"); this.validate(); previous next 54 previous next 56 Björn Eiderbäck 1999-2000 27 Björn Eiderbäck 1999-2000 28

public static void main(string args []){ TestOfFrame frame = new TestOfFrame("Test of frame layout"); Panel panel; frame.addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e) { System.exit(0); ); frame.setsize(200, 300); frame.show(); // Vi skapar en panel panel = new Panel(); frame.add(panel); //Vi skapar några fält for (int i = 0; i < 10; i++) { TextField field = new TextField("Field-" + new Integer(i).toString()); panel.add(field); // Den här gången gör vi "det" efter slingan frame.validate(); // Nu testar vi att ändra layouten frame.testlayoutes(); previous next 57 previous next 59 //Vi skapar några knappar for (int i = 0; i < 10; i++) { Button button = new Button("Button-" + new Integer(i).toString()); panel.add(button); // Alla knappar får bli "stängknappar" button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e){ System.exit(0); ); /* För att ett nytt objekt skall visas på skärmen måste vi göra validate på framen (repaint eller invalidate hjälper inte! Bug??) */ frame.validate(); /* Vi skulle ju kunna göra validate efter slingan och visa alla nya knappar på en gång förstås! */ previous next 58 Björn Eiderbäck 1999-2000 29 Björn Eiderbäck 1999-2000 30