UID – Swing and Graphics Chris Coleman ([email protected])

31
UID – Swing and Graphics Chris Coleman ([email protected])

Transcript of UID – Swing and Graphics Chris Coleman ([email protected])

Page 1: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

UID – Swing and Graphics

Chris Coleman([email protected])

Page 2: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Today

• Graphics When / Why ? Painting What can be done Java 2D

• Full Screen API

Page 3: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Graphics – A big topic

• Could run a whole lecture course on how to use the various graphics capabilities that Swing’s API’s provide.

• Use the Tutorials and API docs at:

• http://java.sun.com/docs/books/tutorial/uiswing/14painting/index.html

• http://java.sun.com/docs/books/tutorial/2d/TOC.html#display

Page 4: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

When do I need to use graphics? (1)

• Avoid using graphics if possible

• You may well only need icons labels and buttons borders styled text areas

JEditorPane JTextPane

Page 5: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

When do I need to use graphics? (2)

• May need graphics if Wish to drastically change appearance of an

existing component Draw shapes to screen Draw text to screen Animation “Invent” / customise your own component

Page 6: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Painting (1)

• Component painting repaint()

automatically called when necessary. Eg Window unhidden

revalidate() automatically called before repaint when needed. Eg

when component sizes or position have changed

• Threads and painting painting on the event-dispatching thread repaint() and revalidate() are thread safe

Page 7: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Painting (2)

• Double buffering Painting performed to off screen buffer, then flushed to

screen when finished.

• Opaque components Improves performance. Time not spent painting behind

components.

• Shape of painting areas always rectangular non-opaque (transparent) components can appear any

shape, although need to use glass panes to mask hit detection area

Page 8: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Painting order

• Visibility based on containment hierarchy Background (if opaque) Custom painting Border Child components

• repaints if transparent component repaints, all components

under it must also repaint. This is costly, therefore use opaque when possible

Page 9: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

What graphics tools are available in Swing?

• Java AWT Graphics Basic but usually enough Shapes Text Images

• Java 2D graphics Extends the AWT graphics to provide much

more, eg gradients, textures etc

Page 10: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Custom painting (1)

• Occurs between background and border• Extend component and customise

JPanel recommended e.g. class myPaintingPanel extends JPanel {

can also use atomic components e.g. class myPaintingButton extends JButton {

• Code goes in overridden paintComponent() method public void paintComponent(Graphics g) {

Page 11: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Custom painting (2)

• When writing custom painting code should not reproduce painting functionality of

any other Swing component

• Before doing anything else in paintComponent() invoke super.paintComponent() or setOpaque(false)

Page 12: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Painting coordinates

• Component sizes in pixels (0,0) at top left corner (width-1,height-1) at bottom right corner

• Border sizes (e.g. a 1-pixel border) (1,1) at top left (width-2, height-2) at bottom right

• General painting area for b pixel border [ {b,b} : {w-(b+1), h-(b+1)} ]

Page 13: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Getting painting coordinates

• Use component getWidth() and getHeight()• Get border sizes with getInsets()

e.g. to get width and height of custom painting area use something like:

Insets insets = getInsets();int currentWidth = getWidth() -

insets.left - insets.right;int currentHeight = getHeight() -

insets.top - insets.bottom;

Page 14: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Repainting custom paints

• Calling repaint() method requests a repaint to occur repaint()

paints whole component & any others that need it if transparent

repaint(int leftx,int lefty,int width,int height); only repaints a specified area

• Component painted after all pending events dispatched.

• Painting should be kept short - Done in event thread - slows GUI

Page 15: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Graphics - shapes and text (1)

• Properties stored in Graphics object. Represents ‘state’

eg Color, Font, etc

• Methods of Graphics can draw... Shapes

lines, rectangles, 3D rectangles, round-edged rectangles, ovals, arcs, polygons

Text Draw string to screen as a graphic

Page 16: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Graphics - shapes and text (2)

• Drawing a shape on screen

• Use paintComponent Graphics

void paintComponent(Graphics g) {

super(g)

g.setColor(Color.RED);

g.drawRect(x, y, width, height);

}

• shapes: x and y specify upper left

Page 17: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Graphics - shapes and text (3)

• Drawing a string on screen• Use paintComponent Graphics again

void paintComponent(Graphics g) { super(g) g.setFont(new Font(“Serif”, Font.PLAIN,

12)); g.drawSring(“Java Swing”, x, y);

}

• x and y specify baseline left of text

Page 18: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Graphics - Images

• Swing Icons by far and away the easiest method of displaying graphics.

• If more features needed then use the AWT/Graphics functionality

• Supports GIF, PNG and JPEG NOT BMP• Loading and displaying images

Image myImage =

Toolkit.getDefaultToolkit().getImage(filename);g.drawImage(myImage, x, y, this);g.drawImage(myImage, x, y, width, height,this);

Page 19: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Tracking Images

• MediaTracker class utility class used to track the status of a number of

images for a particular component. Can get information about any errors and

associated images

• ImageObserver interface implemented by all components can use to get notifications about loading progress

of image as its constructed.

Page 20: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Java2D API (Graphics2D)

• Provides enhanced image, graphics and text capabilities

• Done through extensions to AWT Graphics API

• Amongst others provides Hit detection on Shapes text and images Complex Printing Support Texture rendering Complex Shapes/lines

Page 21: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Java2D Shapes

• Rectangle Shapes

• QuadCurve2D and CubicCurve2D

• GeneralPath Arbitrary shapes made by connecting lines

Page 22: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Java 2D - Text

• Often easier to use JLabels since much of the work is done for you

• Use the drawString method Eg g.drawString(“Hello”, x, y);

• To set font use setFont method Create an instance of Font

Page 23: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Java 2D - Images

• Much more powerful than basic image display

• Images are best rendered in a Buffer off screen as a BufferedImage

• Then drawn to screen with call to Graphics2D.drawImage

• Graphics2D provides variety of image filtering options sharpen/blur, rotate, transform, scale etc

Page 24: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Java 2D – (VERY) Basic use

• Simply cast the Graphics object to Graphics2D

void paintComponent(Graphics g) { super(g); Graphics g2 =

(Graphics2D)g.create(); g2.setColor(Color.BLACK); g2.drawRect(x, y, width, height);

g2.dispose();}

Page 25: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

The Full Screen API

• Full Name: Full Screen Exclusive API

• Introduced in JDK 1.4• Allows programmer to suspend windowing system and draw directly to the screen

• Good for games, slide shows and dedicated terminal applications

• Not covered here, but excellent tutorial found here: http://java.sun.com/docs/books/tutorial/extra/fullscr

een/index.html

Page 26: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Coursework (1)

• Tips… Remember to relate features you design back to the users you defined.

Any design of application is ok SO LONG AS IT’S REASONABLY JUSTIFIED WITH REFERENCE TO YOUR USERS AND DESIGN PRINCIPLES

Grab images off web to increase ‘niceness’ of your application

Page 27: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Coursework (2)

Finally, if the Swing is a struggle – remember that time spent adding little bits of functionality could also be spent writing the report which is still worth 40% of the total.

It’s a UID course – NOT a Swing Showcase…

Page 28: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Coursework (3)

• Not allowed to use JBuilder – sorry… Must code all Swing yourself

• Deadline 3:30pm Thursday 15th November

• Plagiarism – (Cheating) and a reminder not to All code is checked against all others, the web and the past couple of years submissions by a very clever computer…

Page 29: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Coursework (3)Support

• Email Will answer as much as I can, Try to provide as much info as possible about the problem.

• Labs Mondays 2-5 A05

• Example Code available at: www.cs.nott.ac.uk/~cqc/G5BUID

Page 30: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

Summary

• Swing +ve’s Swings good because its Platform Independent

Swing makes it easy to construct simple GUI’s quickly

• Swing –ve’s Swing is not always as Platform Independent as it claims

Can get confusing when GUI’s get BIG, but aided by using an IDE

Java - its not the fastest language ever...

Page 31: UID – Swing and Graphics Chris Coleman (cqc@cs.nott.ac.uk)

The End.