Download EE2E1 Lecture 5

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
EE2E1. JAVA Programming
Lecture 5
Graphics programming and Swing
Contents







Overview of graphics in Java – AWT & Swing
Frames
Swing inheritance hierarchy
Displaying graphics in frames – panels
Displaying text in graphics windows
Drawing simple graphics
Digital image processing in Java
Overview of graphics in Java –
AWT & Swing


Most modern application programs use
sophisticated graphics and have powerful graphical
user interfaces

Spreadsheets

Word processing

Web browsers

Email programs
Its important to extend our knowledge from
writing crude console-based programs to portable
graphical applications

Java, unlike C & C++, has standard packages for
graphics

2 related packages and sub-packages support
graphics in Java


java.awt (Abstract Windows Toolkit)

javax.swing
AWT is ‘peer-based’

Depends on graphical elements native local
platform’s graphics system

Unix/Windows graphical programs written
using AWT will have a different ‘look and feel’


Swing is much more platform independent

Graphical components are pre-built and are
simply painted onto windows

Relies less on the underlying runtime
environment

Usually slower than AWT-based programs
In practice graphical programs are a mixture of
Swing and AWT classes

AWT takes care of all of the event handling for
GUI’s (see later)
Frames
A frame is a top level window which is a
container for graphical components
(canvas, buttons, menus etc)
 The AWT has a Frame class and Swing has
a JFrame class
 The following program displays an empty
frame

import javax.swing.*;
class MyFrame extends JFrame
{
public MyFrame()
{
setTitle("My first graphics program");
setSize(400,300);
}
}
public class FrameTest
{
public static void main(String[] args)
{
JFrame frame=new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

A class MyFrame is defined which is a sub-class
of JFrame

A title is added

The frame is sized to 400x300 (by default, a
frame is 0x0)

The frame is created by a call to the constructor

The application terminates when the window is
closed

The frame is displayed by a call to
JFrame.setVisible(true)

This creates a separate thread which runs until
the program is terminated – the main thread
terminates
Swing inheritance hierarchy
The JFrame class inherits attributes from
higher level container classes
 Typically for resizing and positioning
frames
 Class names beginning with ‘J’ are Swing
classes – everything else is part of AWT

Component
Container
JComponent
Window
…..
Frame
JPanel
JFrame

Most swing components (for example
JPanel) are derived from the JComponent
class

JFrame, being a top level window, is
derived from the Window class

Other top level windows include JApplet
and JDialog
Top Level Containers : JDialog

javax.swing.JDialog:




More simple and limited than frames
Typically used for showing a short message on the screen
Also has a border and a title bar
Use the static method of JoptionPane to show standard
dialog boxes:
JOptionPane.showMessageDialog(null, "4+2=6");
Top Level Containers:JFileChooser

javax.swing.JFileChooser:


Allows the the user to choose a file
Supports “open” and “save”: showOpenDialog(),showSaveDialog()
JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION)
System.out.println("File: " + fc.getSelectedFile());
14
Top Level Containers: JFrame

javax.swing.JFrame:


Top-level window with a title and a border.
Usually used as a program's main window
Internal Containers



Not Top level containers
Can contain other non-top level components
Examples:
–
–
–
JScrollPane: Provides a scrollable view of its
components
JSplitPane: Separates two components
JTabbedPane: User chooses which
component to see
16
Displaying graphics in frames –
panels
Frames are containers – they can contain
other user interface/graphical components
 A frame contains a content pane into which
components can be added
 The following code is typical

Container contentPane=frame.getContentPane();
Component c= ….; // UI or graphical component
contentPane.add (c); // Add to the frame

Frame
Content
pane
Panels


Panels (JPanel class) are added to the content
pane
Panels are themselves containers
 The can contain other UI components
 They also have a surface onto which graphics
can be drawn
 Text
 Basic shapes (lines, boxes etc)
 Images
Panels

Panels themselves are general purpose containers
allowing other graphics components to be easily
added
JFrame
JPanel
CIS 068
Drawing on panels

The paintComponent() method in
JComponent (a superclass of JPanel) must
be overridden

paintComponent() is called automatically
when the window has to be drawn or
redrawn – for example when it is moved by
the user. It is also called when the repaint()
method of a panel is called

The following code creates a class MyPanel
into which graphics can be drawn
class MyPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// Code placed here to draw graphics
}
}

The Graphics object defines the graphics
context (fonts, line styles, colours etc)

A call to super.paintComponent() calls the
paintComponent() method in JComponent
(the base class of JPanel)

This call sets up the graphics context and
performs other complex tasks
Displaying text in graphics
windows

Text can be drawn onto panels using the
Graphics.drawString() method

The text font and size can be optionally set/reset

The following program draws a string onto a panel

The panel is then added to a frame which is
then displayed using JFrame.setVisible(true)
import javax.swing.*;
import java.awt.*;
public class MyPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawString("Hello there!",150,125);
}
}
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class HelloFrame extends JFrame
{
public HelloFrame()
{
setTitle("Drawing a string example");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane=getContentPane();
contentPane.add(new MyPanel());
}
}
public class FrameTest
{
public static void main(String[] args)
{
JFrame frame=new HelloFrame();
frame.setVisible(true);
}
}

Text fonts can be set/reset


The existing font applies until it is reset
The following code sets a bold Helvetica
font with a larger font size
public class MyPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Font f=new Font(“Helvetica”,Font.BOLD,25);
g.setFont(f);
g.drawString("Hello there!",150,125);
}
}
Drawing simple graphics


Class java.awt.Graphics contains methods which
allow simple graphics to be drawn in different
colours
Graphics.setcolor() sets the drawing colour
 Colour is represented by the class
java.awt.Color(int red, int blue, int green)
defining the RGB components
 Preset constants exist (defined as static constants
in Color)
 Color.red
 Color.orange
 Color.pink
 etc

Examples of different shapes

Graphics.drawLine(int x1, int y1, int x2, int y2)
draws a straight line from (x1,y1) to (x2,y2)

Graphics.drawRect(int x, int y, int w, int h)
draws a rectangle from upper left hand corner
(x,y) with width w and height h

Graphics.drawOval(int x, int y, int w, int h)
draws an outline of an ellipse with a ‘bounding
rectangle’ as above

Graphics.drawPolygon(int[] xc, int[] yc, int n)
draws a polygon with n vertices with the coordinates being stored in arrays xc and yc

Graphics.fillOval (int x, int y, int w, int h) fills
the oval with the current draw colour
class DrawPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.drawRect(20,30,50,50);
g.setColor(Color.green);
g.drawOval(100,30,90,60);
g.fillOval(100,30,90,60);
g.setColor(Color.yellow);
int[] xcoords={180,200,250,275,225};
int[] ycoords={170,130,130,150,200};
g.drawPolygon(xcoords,ycoords,5);
g.fillPolygon(xcoords,ycoords,5);
}
}
Swing Components
35
Swing Components
Swing components
We will see in the next lecture how we can
put these together to build graphical user
interfaces (GUI’s)
 Swing tutorial
 Swing component examples

Digital Image Processing in Java

Digital Image Processing (DIP) deals with manipulation of
digital images using a digital computer
 Java can support and handle digital image processing
efficiently using various functions.
Digital Image Processing in Java

Java BufferedImage class is a subclass of the Image class
 It is used to handle and manipulate the image data
 All BufferedImage objects have an upper left corner
coordinate of (0, 0)
x
y
pixel

Documented in
http://docs.oracle.com/javase/7/docs/api/java/awt/image
/BufferedImage.html
Digital Image Processing in Java

Creating a BufferedImage object is easy

Both RGB and Greyscale images can be created
import java.awt.image.BufferedImage;
...
BufferedImage img = new BufferedImage(256, 256,
BufferedImage.TYPE_INT_RGB);




BufferedImage.TYPE_INT_RGB specifies RGB
BufferedImage.TYPE_INT_ARGB specified RGB
with an additional alpha (transparency channel)
BufferedImage.TYPE_BYTE_GRAY specifies
greyscale
etc
Digital Image Processing in Java

Using a BufferedImage object to read/write pixels
is easy
int r = 10; // red component 0...255
int g = 20; // green component 0...255
int b = 30; // blue component 0...255
int col = (r << 16) | (g << 8) | b;
img.setRGB(x, y, col);
Colour c = new Color(img.getRGB(x, y));
int red=c.getRed();
int green=c.getGreen();
int blue=c.getBlue();
Digital Image Processing in Java

Reading and writing a BufferedImage object
from/to file is also easy

A variety of file types (jpg, png etc) can be used

png is losless, jpg is lossy

Other file types can be created such as gif, bmp etc.

Makes use of the utility class javax.imageio.ImageIO
and static methods read(…) and write(…)

Check the docs for details!
import javax.imageio.ImageIO;
Digital Image Processing in Java

Example code snippet
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.image.BufferedImage;
public class ImageIOExample {
public static void main(String[] args)
{
BufferedImage bImage = null;
try{
File image = new File(“myImageFile");
bImage = ImageIO.read(image);
ImageIO.write(bImage, “png",
new File("/image.png"));
ImageIO.write(bImage, “gif",
new File("myDir/image.gif"));
}
catch(Exception e){}
}
}
Digital Image Processing in Java

Displaying a BufferedImage object is also easy

We use the drawImage() method in a the JPanel class
public class ImagePanel extends Jpanel
{
private BufferedImage image;
public ImagePanel() {….}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
}
Digital Image Processing in Java
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.awt.*;
public class ImageIOExample {
public static void main(String[] args)
{
BufferedImage bImage = null;
try{
File image = new File("Rooney.jpg");
bImage = ImageIO.read(image);
}
catch(Exception e){}
JFrame frame=new JFrame();
frame.setSize(400,500);
ImagePanel panel=new ImagePanel(bImage);
Container contentPane=frame.getContentPane();
contentPane.add(panel);
frame.setVisible(true);
}
}
Digital Image Processing in Java
class ImagePanel extends JPanel
{
private BufferedImage image;
public ImagePanel(BufferedImage im) {image=im;}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
}
class ImageProcessor
{
// Add our image processing algorithms here!
}
Digital Image Processing in Java
class ImageProcessor
{
// Add our image processing algorithms here!
private BufferedImage image;
public ImageProcessor(BufferedImage im) {image=im;}
public void toGreyscale()
{
for (int x=0; x<image.getWidth(); x++)
for (int y=0; y<image.getHeight(); y++)
{
Color c = new
Color(image.getRGB(x, y));
int red=c.getRed();
int green=c.getGreen();
int blue=c.getBlue();
int grey=(red+green+blue)/3;
// roughly!
Color greyRGB=new
Color(grey,grey,grey);
image.setRGB(x,y,greyRGB.getRGB());
Digital Image Processing in Java

As an exercise, see if you can create an
ImageProcessor object within the
ImageIOExample main method and then
call it’s toGreyscale() method
And finally ….



Swing/AWT are massive and complex
 We have only scratched the surface
Typically Java API’s have been built on top of
Swing
 Java2D
 Java3D
In practice, you would use these to do real work
for example involving image processing or 3D
rendering