Title: Abstract Windowing Toolkit
1Abstract Windowing Toolkit
- Design Goal
- allow the programmer to build o GUI that looks
good on all platforms - provide a well-designed object-oriented interface
to low-level services and resources (tracking the
mouse, reading the keyboard, writing to the
screen etc.) so programmers don't have to worry
about the details - The user interface elements provided by the AWT
are implemented using each platform's native GUI
toolkit, thereby preserving the look and feel of
each platform.
2Abstract Windowing Toolkit
- java.awt
- Graphics
- colors, images, fonts, polygons, e.t.c.
- Components
- GUI (graphical user interface) components
(buttons, menus, lists, dialog boxes) - Layout Managers
- classes which control the layout of components
within their container objects - java.awt.datatransfer (classes for cut-and-paste)
- java.awt.event (classes for event handling)
- java.awt.image (classes for image manipulation)
3Inheritance relationship between the user
interface component classes
4Component classes (detailed)
5The basic awt components
6Basic Applet
- import java.awt.
- import java.applet.
- public class Example1 extends Applet
- public void paint(Graphics g)
- g.drawString("First applet", 10, 10)
-
7HTML Code that contains the applet
lt!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2
Final//EN"gt ltHTMLgt ltHEADgt ltTITLEgtApplet Test
Pagelt/TITLEgt lt/HEADgt lth1gtApplet Test
Pagelt/h1gt ltapplet code"Example1.class" width
400 height400 name"Applet1"gt lt/appletgt lt/B
ODYgt lt/HTMLgt
8Another Example
- import java.awt.
- import java.applet.
- public class Example2 extends Applet
- Button
- b1 new Button("Button 1"),
- b2 new Button("Button 2")
- public void init()
- add(b1)
- add(b2)
-
9How AWT components draw themselves
- programs can draw only when AWT tells them to
- AWT orders drawing requests by making them run in
a single thread - AWT orders a component to draw itself by invoking
its update() method - The default implementation of the update() method
clears the Components background and then calls
the paint() method - The default implementation of the paint() method
does nothing - AWT can call the paint() method directly (e.g.
when an area of a Component is revealed after
being hidden behind an other window) - a Graphics object is the only argument of paint()
and update() - represents the context in which the component can
perform its drawing - The Graphics class provide methods for drawing
and filling lines, rectangles e.t.c., images,
text, for setting and getting colors and fonts
e.t.c.
10Creating the components of a simple editor (a)
The Menus
- Create a new class which extends the Frame class
- public class SimpleEditor extends Frame . . .
- In the Constructor
- Create a MenuBar object
- MenuBar menubar new MenuBar()this.setMenuBar(m
enubar) // this refers to the Frame object - Create and add the Menu objects (File) to the
menu bar - Menu file new Menu(File)menubar.add(file)
- Create and add the MenuItem objects to the Menu
containers (Open, New, Save, Save as, Exit) - MenuItem open new MenuItem(Open)file.add(o
pen)
11Creating the components of a simple editor (b)
The Panel
- Create a new TextArea object and add it to the
scroll pane - TextArea textArea new TextArea()pane.add(textA
rea) - Set the frame size and pop it up
- this.setSize(300, 300)
- this.pack()
- this.show()
12java.awt.event - Events, Listeners, Adapters
- Events
- represent event occurrences
- java.awt.AWTEvent is the superclass of all the
awt events - ActionEvent, TextEvent, MouseEvent, KeyEvent
e.t.c. - Listeners
- extend the java.util.EventListener interface
- provide methods that handle events
- ActionListener, TextListener, MouseListener,
KeyListener e.t.c. - Adapters
- implement the corresponding listener, providing
empty bodies for all the methods of it (it is
useful when we don t want to implement all the
methods of a listener). - MouseAdapter, KeyAdapter e.t.c.
13Example with Events
- import java.awt.
- import java.awt.event. // Must add this
- import java.applet.
- public class Example5 extends Applet
- Button
- b1 new Button("Button 1"),
- b2 new Button("Button 2")
- public void init()
- b1.addActionListener(new B1())
- b2.addActionListener(new B2())
- add(b1)
- add(b2)
-
- class B1 implements ActionListener
- public void actionPerformed(ActionEvent e)
- getAppletContext().showStatus("Button 1")
-
-
14Adding events to our editor
- Opening a document
- open.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
openDocument() ) - Saving a document
- save.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
saveDocument() ) - Handling window close requests
- this.addWindowListener(new WindowAdapter()
public void windowClosing(WindowEvent e)
System.exit(0) )
15Opening a file - File Dialogs
displaying an open file dialog FileDialog dialog
new FileDialog(this, "Select a file",
FileDialog.LOAD) dialog.show() if(dialog.getFil
e() null) return filename
dialog.getDirectory() File.separator
dialog.getFile() to display a save file
dialog FileDialog dialog new FileDialog(this,
"Select a file", FileDialog.SAVE) dialog.show()
16Layout Managers
- A Layout Manager is an object that controls the
position and the size of components in a
container - Every layout manager implements the LayoutManager
interface - By default, every Container has a layout manager
object that controls its layout - for Panel objects instances of the FlowLayout
class - for Window objects instances of the BorderLayout
class - There are five layout manager classes in AWT
- FlowLayout
- GridLayout
- BorderLayout
- CardLayout
- GridBagLayout
17BorderLayout
- Its the default layout manager for all Windows
(Frames, Dialogs, e.t.c.) - the layout is divided into five areas North,
South, East, West and Center - Using BorderLayout
- setLayout(new BorderLayout())add(North, new
Button(North))add(South, new
Button(South))add(East, new
Button(East))add(West, new
Button(West))add(Center, new
Button(Center)) - to insert gaps between the components we use the
following constructor - public BorderLayout(int horizontalGap, int
verticalGap)
18FlowLayout
- Its the default layout manager for all Panels
- It simply lays out components (at their preferred
size) from left to right, starting new rows if
there is not enough space - setLayout(new FlowLayout)add(new Button(This
is a long-named button))add(new
Button(Hello)) - Within each row the components are centered (by
default), left-aligned or right-aligned - Constructors
- public FlowLayout()
- public FlowLayout(int alignment)
- public FlowLayout(int alignment, int
horizontalGap, verticalGap) - alignment FlowLayout.LEFT, FlowLayout.RIGHT,
FlowLayout.CENTER
19GridLayout
- Arranges components into a grid of rows and
columns - The cells are equal size based on the largest
component in the grid - Adding components
- setLayout(new GridLayout(0,2))//construct a
GridLayout with two //columns and
unspecified number of rowsadd(new Button(Button
1))add(new Button(2))add(new
Button(Button 3))add(new Button(Long-Named
Button 4))add(new Button(Button 5)) - At least one of the rows and columns must be
non-zero
20CardLayout
- Helps to manage two or more components that share
the same display space. - Adding componentsPanel cards new
Panel()cards.setLayout(new CardLayout())...//C
reate a Panel named p1. Put buttons in
it....//Create a Panel named p2. Put a text
field in it.cards.add("Panel with Buttons",
p1)cards.add("Panel with TextField", p2) - Showing its components((CardLayout)cards.getLayou
t()).show(cards, Panel with Buttons) - Choosing a componentpublic void first(Container
panel)public void next(Container panel)public
void previous(Container panel)public void
last(Container panel)public void show(Container
panel, String name)
21GridBagLayout
- The most flexible and complex layout manager
- Places components in a grid of rows and columns
- the applet specifies the size and position
characteristics of its components is by by means
of GridBagConstraints - GridBagLayout gridbag new GridBagLayout()GridB
agConstraints c new GridBagConstraints()setLay
out(gridbag)//...Create the component...//...Se
t instance variables in the GridBagConstraints
instance... gridbag.setConstraints(theComponent,
c)add(theComponent)
22GridBagConstraints instance variables
- gridx, gridy Specify the column and row of the
upper left of the component - gridwidth, gridheight Specify the number of
columns or rows in the component's display area - fill how to resize the component when its
display size is larger than its requested size - ipadx, ipady how many pixels to add to the
minimum size of the component - insets the minimum amount of space between the
component and the edges of its display area - anchor where to place the component when its
smaller than its display area - weightx, weighty how to distribute space among
columns (weightx) and among rows (weighty)
23Absolute Positioning
- we do not use any layout manager
- setLayout(null)
- adding the components
- Button b1 new Button(one)
- add(b1)
- specifying the exact size and position
- We overwrite the paint(Graphics g) method and
specify the position and size of each component - b1.reshape(70 insets.left, 35 insets.top,
50, 20) - We should avoid using absolute positioning in
order to guarantee a platform-dependent component
appearance
24Example with layouts/panels (1)
- import java.applet.
- import java.awt.
- public class Example6 extends Applet
-
- public void init()
-
- Panel p
- setLayout(new BorderLayout())
-
- p new Panel()
- p.add(new TextArea())
- add("Center", p)
-
- p new Panel()
- p.add(new Button("One"))
- p.add(new Button("Two"))
-
- Choice c new Choice()
continued
25Example with layouts/panels (2)
- public static void main(String args)
-
- Frame f new Frame("Example 6")
- Example6 ex new Example6()
- ex.init()
- f.add("Center", ex)
- f.pack()
- f.show()
-
26Common problems
- when a window never shows up
- set the window size or pack it
- when the component never shows up
- if the container is already visible call
validate() on the container after adding the
componenô - How can I specify a components exact size?
- standard components size depends on the platform
and the fonts that are used. You dont need to
specify their exact size. - for custom components you need to override
getMinimumSize() and getPreferreSize() methods. - component sizes are subject to the layout manager
you use
27Shapes, Text, Images
- The class Graphics provides methods for drawing
Lines, Rectangles (simple, 3D and round-edged
rectangles), Ovals, Arcs and Polygons. - g.drawLine(10, 10, 120, 100)
- drawing text
- g.drawString(Hello World, 50, 50) //g
instance of Graphics - setting fonts
- g.setFont(new Font(new Font(Helvetica,
Font.ITALIC, 14))) - loading Images
- Image image getImage(URL) //in an applet
- Image image Toolkit.getDefaultToolkit().getImage
(filenameOrURL) - displaying Images
- g.drawImage(image, 0, 0, this)
28Extending AWT JFC Swing
- a new GUI API based on AWT
- new visual components (tables, split panes,
toolbars, trees, progress bars e.t.c) - drag and drop support
- pluggable Look Feel support
- two releases
- JFC 1.1 (for use with JDK 1.1)
- JDK 1.2
- For each AWT component there is a equivalent
Swing component (JButton, JLabel, JFrame, e.t.c.) - Swing components are implemented with absolutely
no native code - They have much more capabilities than AWT
components