Grafiska komponenter Fönsterhantering, grafik (del 1) Vanligast använda: JFrame ContentPane LayoutManager JPanel JLabel JButton Programmering tillämpningar och datastrukturer 2 Paket Klassdiagram för Component java.util Listor, sortering, etc. java.awt Gamla fönsterhanteringsklasser java.awt.event Händelsestyrning javax.swing Nya J klasser Programmering tillämpningar och datastrukturer 3 J = finns i javax.swing annars i java.awt Programmering tillämpningar och datastrukturer 4 Component +repaint() +update() Tungviktiga komp. i Swing Window +add() +remove() +setlayoutmanager() +validate() +setdefaultcloseoperation() +setsize() JComponent JApplet, JDialog, JFrame, JWindow Använder operativsystemets grafiska funktioner Plattformsberoende +setpreferredsize() Frame AbstractButton +seticon() +isselected() JFrame JButton JLabel JPanel +pack() +settext() +show() +isdefaultbutton() +seticon() Programmering tillämpningar och datastrukturer 5 Programmering tillämpningar och datastrukturer 6 1
Lättviktiga komp. i Swing JComponent och dess subklasser Lånar utrymme från en tungviktskomponent Ritas upp av Java direkt Körs i en egen tråd Kan köras parallellt med annat som pågår i operativsystemet Dubbelbuffrad Behöver bara flashas (snabbt) när allting är uppritat på ett internt virtuellt utrymme Komponenter Komponenter kan alltså i sin tur vara behållare för andra komponenter hierarchy Topp-nivå behållare speciella Utgör yttre gräns mot operativsystemet Definierar en yta där komponenterna kan måla upp sig själva Programmering tillämpningar och datastrukturer 7 Programmering tillämpningar och datastrukturer 8 addfocuslistener(focuslistener l) addkeylistener(keylistener l) addmouselistener(mouselistener l) Etc. repaint() If this component is a lightweight component, this method causes a call to this component's paint method. Otherwise, this method causes a call to this component's update method. repaint(long tm) Inom tm millisekunder repaint(int x, int y, int width, int height) Programmering tillämpningar och datastrukturer 9 Programmering tillämpningar och datastrukturer 10 update(graphics g) The update method of Component calls this component's paint method to redraw this component. This method is commonly overridden by subclasses which need to do additional work in response to a call to repaint. Subclasses of Component that override this method should either call super.update(g) or call paint(g) directly from their update method. paint(graphics g) This method is called when the contents of the component should be painted; such as when the component is first being shown or is damaged and in need of repair. Subclasses that override this method need not call super.paint(g). Graphics getgraphics() Verktygslåda för att visualisera, rita Kommer ihåg vilken enhet man ritar på» Fönster, printer, Kommer ihåg vilken färg på penseln, etc. Programmering tillämpningar och datastrukturer 11 Programmering tillämpningar och datastrukturer 12 2
Vägen från repaint() till paint() Protokoll för class myrect extends Component { changeshape( ) { repaint(); paint(graphics g) { java.awt abstract class Component { void repaint() { paint(g); update(g); void update(graphics g) { paint(g); add(component comp) Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component. remove(component comp) This method also notifies the layout manager to remove the component from this container's layout. Programmering tillämpningar och datastrukturer 13 Programmering tillämpningar och datastrukturer 14 Protokoll för setlayout(layoutmanager mgr) LayoutManager getlayout() validate() Is used to cause a container to lay out its subcomponents again. It should be invoked when this container's subcomponents are modified (added to or removed from the container, or layoutrelated information changed) after the container has been displayed. Topp-nivå behållare sköter utskick av händelser som genereras externt (ex.vis. av användaren) Musknappar Musrörelser Tangentnertryckning Kan dessutom behöva använda interna händelser Ex. timer Programmering tillämpningar och datastrukturer 15 Programmering tillämpningar och datastrukturer 16 Protokoll för JFrame Konstant: EXIT_ON_CLOSE Konstruktor: JFrame(String titelrad) setdefaultcloseoperation(int op) Protokoll för JFrame setlayout(layoutmanager manager) add(component comp) remove(component comp) getcontentpane() setmenubar(menubar m) setsize(int w, int h) pack() show() // anpassa fönsterstorlek till innehåll // detta bör göras sist Programmering tillämpningar och datastrukturer 17 Programmering tillämpningar och datastrukturer 18 3
Protokoll för JComponent repaint(long tm, int x, int y, int width, int height) Senast om tm millisekunder repaint(rectangle r) revalidate() Protokoll för JComponent paint(graphics g) Invoked by Swing to draw components. Applications should not invoke paint directly, but should instead use the repaint method to schedule the component for redrawing. [ ] ensure that children appear on top of component itself. Subclasses can just override this method, as always. A subclass that just wants to specialize the UI (look and feel) delegate's paint method should just override paintcomponent. Programmering tillämpningar och datastrukturer 19 Programmering tillämpningar och datastrukturer 20 JPanel(LayoutManager layout) add(component c) paintcomponent(graphics g) repaint() Protokoll för JPanel Protokoll för JLabel JLabel(String text, Icon image, int horizontalalignment) JLabel(String text, int horizontalalignment) JLabel(String text) JLabel(Icon image, int horizontalalignment) JLabel(Icon image) settext(string text) seticon(icon icon) seticontextgap(int icontextgap) Programmering tillämpningar och datastrukturer 21 Programmering tillämpningar och datastrukturer 22 Protokoll för JLabel Protokoll för AbstractButton setverticalalignment(int alignment) Positionerar innehåll» JLabel.TOP» JLabel.CENTER» JLabel.BOTTOM sethorizontalalignment(int alignment)» JLabel.LEFT» JLabel.CENTER» JLabel.RIGHT setverticaltextposition(int textposition) Positionerar text» ovanstående + JLabel.LEADING» JLabel.TRAILING seticon(icon defaulticon) isselected() Hela knappen Kan även testa för press, rollover Icon getselectedicon() addactionlistener(actionlistener listener) Programmering tillämpningar och datastrukturer 23 Programmering tillämpningar och datastrukturer 24 4
Component Protokoll för JButton +repaint() +update() JButton(String text, Icon icon) JButton(Icon icon) JButton(String text) +add() +remove() +setlayoutmanager() +validate() +setdefaultcloseoperation() +setsize() boolean isdefaultbutton() Window JComponent +setpreferredsize() Frame AbstractButton +seticon() +isselected() JFrame JButton JLabel JPanel Programmering tillämpningar och datastrukturer 25 +pack() +settext() +show() +isdefaultbutton() +seticon() Programmering tillämpningar och datastrukturer 26 BorderLayout BorderLayout Fem regioner (med max en komponent i varje) NORTH SOUTH EAST WEST CENTER (default) WEST NORTH CENTER EAST Panel p = new JPanel(); p.setlayout(new BorderLayout()); p.add(new Button("Okay"), BorderLayout.SOUTH); SOUTH Programmering tillämpningar och datastrukturer 27 Programmering tillämpningar och datastrukturer 28 Matris-layout Alla komponenter ges samma utrymme Dvs. lika stora rutor GridLayout FlowLayout Komponenterna läggs upp i en rad Komponenterna skalas inte Får inte alla komponenter plats bredvid varandra påbörjas ny rad Automatisk omplacering om fönsterstorleken skulle ändras Programmering tillämpningar och datastrukturer 29 Programmering tillämpningar och datastrukturer 30 5
BoxLayout Som FlowLayout, men med fler kontrollmöjligheter: Kan lägga raden vertikalt Kan påverka komponenternas storlek setpreferredsize(new Dimension(10, 30)); Mellanlägg mellan komponenterna createridigarea(new Dimension(20, 100)); Abstrakt klass Graphics Konkret klass med metoddefinitioner tillhandahålls av JVM Beroende på vilken typ av fysisk enhet som ska ritas på Skrivare Skärm Fil Beroende på plattform Programmering tillämpningar och datastrukturer 31 Programmering tillämpningar och datastrukturer 32 Graphics Clip Innehåller tillståndsinformation: Vilken komponent som ska ritas på Koordinatsystemets nollpunkt Används vid clipping och translation Gällande clip (Del)område där grafiken inte är skymd Vald färg Vald font Logisk pixeloperation (XOR el. paint) Alternativa XOR-färgen Programmering tillämpningar och datastrukturer 33 Programmering tillämpningar och datastrukturer 34 Rectangle getclipbounds() Shape getclip() setclip(int x, int y, int width, int height) setclip(shape clip) cliprect(int x, int y, int width, int height) Intersects the current clip with the specified rectangle. The resulting clipping area is the intersection of the current clipping area and the specified rectangle. translate(int x, int y) Förskjut koordinatsystemet till <x,y> hitclip(int x, int y, int width, int height) Returnerar true om clip-området överlappar med den angivna rektangeln (som kanske är omgivande rektangel för en annan grafik) Programmering tillämpningar och datastrukturer 35 Programmering tillämpningar och datastrukturer 36 6
Color getcolor() setcolor(color color) Kommer att rita och skriva i denna färg setxormode(color c1) When [subsequent] drawing operations are performed, pixels which are the current color are changed to the specified color, and vice versa. drawline(int x1, int y1, int x2, int y2) Linje från <x 1,y 1 > till <x 2,y 2 > drawrect(int x, int y, int width, int height) Mått angivet i pixel fillrect(int x, int y, int width, int height) clearrect(int x, int y, int width, int height) Fyller rektangeln med bakgrundsfärgen drawoval(int x, int y, int width, int height) drawarc(x, y, width, height, int startangle, int arcangle) Programmering tillämpningar och datastrukturer 37 Programmering tillämpningar och datastrukturer 38 drawpolyline(int xpoints[], int ypoints[], int npoints) Draws a sequence of connected lines defined by arrays of x and y coordinates. drawpolygon(int xpoints[], int ypoints[], int npoints) Händelser Topp-nivå containers genererar Action när de får signaler från operativsystemet Dessa fångas upp och tolkas sedan i relevanta komponenter Där skapas specifika händelser Skickas ut till alla lyssnare Objekt som har registrerat sig som lyssnare hos den här komponenten Programmering tillämpningar och datastrukturer 39 Programmering tillämpningar och datastrukturer 40 Component +addmouselistener() +addkeylistener() +addfocuslistener() +addcomponentlistener() Timer +addlistener() Dessutom kan ett objekt registrera sig hos en timer som kommer att generera händelser av typen ActionEvent: Window JComponent +addwindowlistener() Frame +addchangelistener() +addpropertychangelistener() AbstractButton +addactionlistener() enemy = world.area()[15][15].initaddenemy(player); javax.swing.timer t = new javax.swing.timer(timestep, enemy); t.start(); JFrame JButton JLabel JPanel Programmering tillämpningar och datastrukturer 41 Programmering tillämpningar och datastrukturer 42 7