1 / 60

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 Hur gör man i Swing då?. Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java. OOMPA 2001 Föreläsning 11a. Frameworks (FW).

raina
Download Presentation

Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Innehåll, kort om: Frameworks Grafik med främst AWT Grafiska interaktiva applikationer Händelsehantering Hur gör man i Swing då? Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java OOMPA 2001 Föreläsning 11a

  2. 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 • å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

  3. 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

  4. Hollywood • Omvänd kontroll • Ibland talar man om Hollywood-principen i ett framework • Ring inte oss vi ringer er! Koda med klassbibliotek Koda med framework Framework Användarkod kod i klassbibliotek användarkod

  5. 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.htmlGraphics http://java.sun.com/docs/books/tutorial/2d/index.html • Input/output Framework • Strömmar med in- och utmaning • Se http://java.sun.com/docs/books/tutorial/essential/io/index.html

  6. 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

  7. Några viktiga klasser i java.awt java.applet Applet java.awt Button Button List Panel Label Dialog ScrollPane java.lang Object Window Component Container Frame … TextArea TextComponent TextField

  8. Skapa fönster import java.awt.*; publicclassFrameHelloFirst extends Frame { publicstaticvoid main(String [] args) { FrameHelloFirst frame = new FrameHelloFirst(); frame.setSize(200, 300); //Fönstrets storlek frame.setVisible(true); //Öppna fönstret } }

  9. 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 } }

  10. ... • 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); }...

  11. 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

  12. 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 }

  13. En rutin för att rita lite olika grafik publicvoid 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); }

  14. Ett objekt som själv ritar på skärmen import java.awt.*; publicclass Ball { Color myColor; Point position; int radius; public Ball(Color aColor, Point aPosition, int aRadius) { myColor = aColor; position = aPosition; radius = aRadius; } publicvoid paint(Graphics g) { g.setColor(myColor); g.fillOval(position.x - radius, position.y - radius, 2 * radius, 2*radius); } }

  15. … och ändra i Frameklassen publicclass FrameHelloFourth extends Frame { Ball [] theFigures = { new Ball(Color.red, new Point(70, 70), 50), new Ball(Color.blue, new Point(75, 170), 70)}; publicstaticvoid 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()); } publicvoid paint(Graphics g) { for(int i = 0; i < theFigures.length; i++) { theFigures[i].paint(g); } } }

  16. 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

  17. 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);

  18. 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)

  19. 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)

  20. Rita bilder • Hämta bild från fil (från en Framemå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);

  21. 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) • 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()); }

  22. 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

  23. 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 • Lyssnarna och deras interface tillhör ett gemensamt package nämligen: java.awt.event

  24. 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(); //... }

  25. ... 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); }

  26. Lyssna efter stängningshändelse (med inre klass) import java.awt.*; import java.awt.event.*; publicclass FrameHelloSecond extends Frame { publicstaticvoid 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()); } }

  27. ... och den inre klassen class MyWindowListener implements WindowListener { publicvoid windowOpened(WindowEvent e) {} publicvoid windowClosing(WindowEvent e) { System.exit(0); } publicvoid windowClosed(WindowEvent e) {} publicvoid windowIconified(WindowEvent e) {} publicvoid windowDeiconified(WindowEvent e) {} publicvoid windowActivated(WindowEvent e) {} publicvoid windowDeactivated(WindowEvent e) {} }

  28. "Ritprogram" i Java 1.1 import java.awt.*; 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); this.addMouseListener(this); this.addMouseMotionListener(this); } Vi deklarerar att vi imple- menterar rätt gränssnitt Vi lyssnar på både musknappar och musrörelser

  29. ... // 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; } Vi tar hand om mustryck Vi tar hand om musrörelser

  30. ... Vi måste implementera hela “lyssnaren” // Metoder deklarerade i MouseListener måste implementeras // ä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); } }

  31. Frame (och Applet) hur var det nu… • 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[]) • 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 java.lang java.awt java.applet Object Component Container Panel Applet Window Frame

  32. 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

  33. Händelselyssnare, några typiska KeyListener TextListener EventListener ActionListener MouseListener ComponentListener MouseMotionListener FocusListener ItemListener WindowListener AdjustmentListener ContainerListener

  34. 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

  35. Adaptorer ActionListener Object ComponentAdapter AdjustmentListener ContainerAdapter ComponentListener FocusAdapter ContainerListener Gränssnitt FocusListener Klasser Gränssnitt KeyAdapter ItemListener MouseAdapter KeyListener MouseListener MouseMotionAdapter MouseMotionListener WindowAdapter TextListener WindowListener

  36. Scribble med inre klasser och adaptorer import java.awt.*; 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();} });

  37. ... // 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; } });

  38. ... // 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); } }

  39. Klasshierarki AWT Object Component Container List Label Button Checkbox TextComponent Panel TextField TextArea Window Applet Dialog Frame

  40. 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

  41. 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 panel2 panel1

  42. Exempel: komponenter • Ett test av att skapa olika typer av komponenter och låta det hela placeras automatiskt

  43. ... 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. import java.awt.*; 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;

  44. ... 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);

  45. ... list = new List(); list.addItem("List 1"); list.addItem("List 2"); add(list); choice = new Choice(); choice.addItem("A"); choice.addItem("B"); add(choice); scrollbar = new Scrollbar(); add(scrollbar);

  46. ... 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

  47. Layoutmanagers för att kontrollera placering av komponenter LayoutManager BorderLayout GridBagLayout GridLayout CardLayout FlowLayout

  48. ... • 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 beskrivahur komponenter placeras samt deras utsträckning

  49. Exempel: Flowlayout import java.awt.*; 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]); } } }

  50. ... • Layouten ”följer med” förändringar av fönsterstorlek

More Related