Agenda - PowerPoint PPT Presentation

1 / 97
About This Presentation
Title:

Agenda

Description:

Agenda Graphical User Interfaces-- overview-- essential elements Containers-- overview-- composition vs. inheritance Components-- examples Layout Managers – PowerPoint PPT presentation

Number of Views:102
Avg rating:3.0/5.0
Slides: 98
Provided by: DavidD181
Category:

less

Transcript and Presenter's Notes

Title: Agenda


1
Agenda
Graphical User Interfaces -- overview --
essential elements Containers -- overview --
composition vs. inheritance Components --
examples Layout Managers -- examples
Our Roadmap
2
Agenda
Graphical User Interfaces -- overview --
essential elements Containers -- overview --
composition vs. inheritance Components --
examples Layout Managers -- examples
Our Roadmap
3
Graphical User Interface
  • A Graphical User Interface (GUI) is one variety
    of user interface. .
  • User interacts with objects on the screen
    (icons, buttons, scroll-bars, etc.) via mouse
    clicks or keyboard actions.

Ok
4
GUI Popularity
  • Popularized in 1980s by the Macintosh.
  • Now state of the practice, and not final word in
    UI
  • Intended to replace text-based "command line" and
    "function key" interfaces.
  • Despite similarities, GUIs are typically
    platform-specific (Windows 95/98/NT/1900, MacOS,
    X Windows look-and-feel standards).
  • Some graphical toolkits now provide
    cross-platform APIs. E.g. wxWindows, GTK, Java.

5
Javas GUI Capabilities
Java provides essentially two related toolkits
for making GUIs The Abstract Windowing
Toolkit ("AWT"), and The Java
Foundation Classes ("Swing") Swing is merely an
expanded version of the AWT, and provides greater
control and convenience.
6
Why Two Toolkits in Java?
MFC and always "BSoD"
AWT, then JFC or "Swing"
Well, its a long story. In short, JFC (swing)
is Suns answer to Microsofts MFC--a detailed
toolkit library.
7
Cautionary Note
Weve noted that Java has two flavors of
toolkits Swing and AWT. It is not always wise
to mix AWT and Swing Components. For your first
programs, stick with one toolkit or the
other. In the following slides, we will use AWT
Components to show the basics. Then, we will
switch to Swing Components. How do you tell them
apart? Generally, but not always, Swing
Components will have a "J" in front of the class
name
AWT
Swing
8
Keep in Mind
  • We are going to be describing graphical elements
    in source code (text).
  • There are drag and drop systems but usually there
    is an underlying text-based system
  • Eventually you need to get down to the text level
  • Java is designed to work across different
    platforms.
  • This poses special challenges

9
Steps to GUI Construction
We will learn GUI creation in two steps the
"view", and then the "controls" or event handling.
1.
  • In Java, to create a GUI, you (1)
  • Specify a Container, using . . .
  • a Layout Manager to . . .
  • place Components and/or Containers of
    Components . . .
  • on the screen as desired.

I.e. UI form and appearance
TODAY
LATER
2.
  • In Java, to make a GUI act as the
  • interface for a program, you (2)
  • Design human/computer dialog, using Listeners
    and component-generated events

I.e. UI interaction and behavior
10
Agenda
Graphical User Interfaces -- overview --
essential elements Containers -- overview --
composition vs. inheritance Components --
examples Layout Managers -- examples
Our Roadmap
11
GUI Design Creation
There are three essential constructs in any GUI
Containers -- used to hold items (e.g., the
frame) Components -- the widgets or
interactors (e.g., buttons) LayoutManagers
-- the hidden algorithm used to organize the
widgets inside the container
offset
offset
12
Pop Quiz (hint)
What are the three basic constructs used in
every GUI?
13
Agenda
Graphical User Interfaces -- overview --
essential elements Containers -- overview --
composition vs. inheritance Components --
examples Layout Managers -- examples
Our Roadmap
14
Containers
STEP 1
Containers are special components that may
contain other components.
Note Containment is not the same as inheritance
extension. A Frame may contain buttons, but
buttons are not subclasses of Frame.
15
Containers
  • A Container is a class that extends from
    java.awt.Container
  • As it turns out, the class "Container" is itself
    a Component.
  • Containers can have
  • Layouts set on them
  • Other components or containers added to them.

Object
Component
Container
16
Example
Lets make a simple Frame. When working
with GUIs, you often have to consult the
API. Note the inheritance structure of your
classes.
17
Example
So far, weve used the API to learn how to make a
Frame. We found constructors for public Frame
() public Frame (String strTitle) Now, how
can we set the size of the Frame? We again
return to the API.
18
Example
The class java.awt.Frame does not contain a
method to set its size. But such a method was
inherited from java.awt.Component
19
Example
Likewise, theres no method in java.awt.Frame to
make the Frame visible. Instead, we find the
method "show()" was inherited from java.awt.Window
20
Hello GUI
import java.awt. public class HelloGUI
public static void main (String arg)
System.out.println ("About to make
GUI") Frame f new Frame ("Hello
GUIs") f.setSize( 200, 200 )
f.show() System.out.println
("Finished making GUI") // main // class
HelloGUI
21
(Demonstration)
22
What?
Our program runs, and the frame never goes away.
When we reach the end of main (as our print
statement indicates) why doesnt the program end?

23
Explanation
When the Java VM created our Frame, it entered
into a kind of infinite loop, waiting for
input and events. (This is common of graphical
toolkits.)
while(true) //get user input // handle
event
Since we didnt write any event handlers, not
even the "window disposal" button will work.
24
Solution
To fix this problem, well have to write some
event handling code. But in order to write some
event handling code, we have to create some
components So, for now, youll just have to
use Ctrl-C to end the program. Once the basics
of GUI construction are covered, well return to
this problem.
25
Agenda
Graphical User Interfaces -- overview --
essential elements Containers -- overview --
composition vs. inheritance Components --
examples Layout Managers -- examples
Our Roadmap
26
Design Idea
We really have two choices when working with
top-level containers
java.awt.Frame
MyGUI
MyGUI
java.awt.Frame
27
Design Note
But the tension between inheritance and
composition has been with us.
28
Example
import java.awt. public class
HelloComposition Frame f public
HelloComposition() f new Frame("Composition
Test") f.setSize(200,200)
f.setBackground(Color.red) f.show()
public static void main (String arg)
HelloComposition h new HelloComposition()

29
Example
A few changes allows us to convert between the two
import java.awt. public class HelloInheritance
extends Frame Frame f public
HelloInheritance() f new Frame
super("Composition Test") f
this.setSize(200,200) f this.setBackground
(Color.red) f this.show()
public static void main (String arg)
HelloInheritance h new HelloInheritance()
h.show()
30
Whos Kung-Fu is Better
Composition
Inheritance
Saves the single inheritance
Use up our single inheritance
"Wasted inheritance" occurs where we subclass,
but fail to override anything.
Useful when you want the "factory settings" for a
GUI, with no changed behavior
Easier to change basic GUI behavior
Often requires more code, more references
31
Container Summary
Creating containers requires careful
study of the API. Watch the inheritance
structure of the classes. A top-level
container, like a Frame, requires event handlers
(covered later). There are many useful methods
for customizing containers. Just look them up in
the API. E.g.
32
Container Summary
We may often use "composition" where --
We dont anticipate changing behaviors --
We need to save our single inheritance We may
often use "inheritance" where -- We
need to change basic GUI behaviors
33
Agenda
Graphical User Interfaces -- overview --
essential elements Containers -- overview --
composition vs. inheritance Components --
examples Layout Managers -- examples
Our Roadmap
34
Components
STEP 2
Most interactions in a Java GUI are with
Components. Another generic term for Component
is other GUIs (e.g. X Windows) is
"widget". Different types of components for
different types of interaction (e.g. buttons,
etc.) User interactions with components create
events (thus, event- driven programming) As a
rule, a Component cannot have other components
inside Exceptions to rule pop up menus may have
menu items added to them. And Containers are
themselves components due to inheritance.
35
Component Examples
Demo HelloWidget
36
Component Examples
Component - generic widget that you can
interact with Button - a widget
that you can press Canvas - a
widget that you can draw on Checkbox -
a widget that is checked or not checked
Choice - an option menu that drops
down Container - a generic class that
contains Components Panel - a
Container to be used inside another
container used to split an
existing window Label - a
single line of read-only text List
- a list of Strings Scrollbar
- a horizontal or vertical scrollbar
TextComponent TextArea - multi-line
editable text TextField -
single-line editable text
37
Components--Examples
  • Canvas
  • typically a drawing surface on which shapes,
    graphs, pictures, etc can be drawn.
  • utilize mouse events and mouse motion events to
    interact with the user to accomplish the drawing
    tasks.
  • TextField
  • a one-line data entry area
  • theoretically infinite in length
  • can generate Key events to indicate that the
    user has typed a key
  • more typically, it generates an Action event
    when the user finishes the data entry and hits
    Return in the TextField.

38
Components--Examples
  • Button
  • simply a clickable component
  • appears as a standard button on whatever
    graphical environment the user happens to be
    running at the time
  • generates an Action event when clicked
  • Label
  • a one-line field of text.
  • user cannot change this text directly program
    changes text with setText( ) method.
  • usually not used to capture events (but could)
  • usually used as a one-way information source to
    provide a message to the user.

39
Joining Components Containers
Containers have a method public void
add (Component c) that allows us to place items
inside. Thus Panel p new Panel() Button
b1 new Button ("Example 1") Button b2 new
Button ("Example 2") p.add (b1)
p.add(b2) In this example, two buttons are
added to the panel.
40
Example
import java.awt. public class HelloComponent
Frame f public HelloComponent() f new
Frame("Component Test")
f.setSize(200,200) f.setBackground
(Color.red) Panel p new Panel()
Button b new Button ("Hello Components")
p.add(b) f.add(p) f.show()
public static void main (String
arg) new HelloComponent()
41
(Demonstration)
42
Agenda
Graphical User Interfaces -- overview --
essential elements Containers -- overview --
composition vs. inheritance Components --
examples Layout Managers -- examples
Our Roadmap
43
LayoutManagers
STEP 3
We can now create Components and Containers. But
how can they be organized? We might be tempted
to call methods that set the x, y location of a
component in a container. Consulting the API, we
find some likely methods public void
setLocation (int x, int y)
public void setSize (int width, int
height)
44
Layout Managers -- Motivation
  • To arrange items, one could specify the location
    of a Component by specific x and y coordinates.
    The Component class contains the method
    setLocation(int width, int height)
  • Frame f new Frame() f.setSize(500,500)
  • Button myButton new Button ("Click")
  • add(myButton)
  • myButton.setLocation(25, 75)

NOTE Origin 0,0 at top left
Whats wrong with this approach?
Note Buttons x and y coordinate starts from
top left
45
Layout Managers -- Motivation
  • Problems with specifying x, y coordinates for
    Component
  • This becomes tedious for even mildly complex
    GUIs.
  • Addition of more components requires
    recalculation of every components x, y
    coordinate
  • If container resizes (e.g., user expands
    window), calculations have to be redone!
  • Solution
  • Position components based on a percentage of
    available container size. Or create an
    algorithm to place components . . .
  • But Java already does this for you . . .

46
Layout Managers -- AWT Based
  • Java provides several layout managers.
  • We will concentrate here on several of them
  • BorderLayout
  • GridLayout
  • FlowLayout
  • BoxLayout
  • To tell a container which layout manager to use,
    invoke the method
  • setLayout( )
  • and specify a type of layout.
  • For example
  • To specify a BorderLayout
  • setLayout (new BorderLayout())

47
LayoutManagers Two General Flavors
  • One can conceptually divide layout managers into
    two types
  • Those that attach constraints to their
    components.
  • Those that do not.
  • What does this mean, "attach constraints"? If
    a manager attaches constraints to a component,
    then information about a components location
    (e.g., compass points) is stored with the object.

48
LayoutManagers Constraints
  • BorderLayout specifies constraints corresponding
    to compass regions of a container

NORTH
EAST
WEST
CENTER
SOUTH
49
LayoutManagers Constraints
  • BorderLayout then appends constraint information
    on all components, e.g.
  • this.setLayout (new BorderLayout())
  • Button e new Button ("East")
  • Button w new Button ("West")
  • Button n new Button ("North")
  • add(e, "East") // deprecated
  • add("West", w) // works deprecated
  • add(n, BorderLayout.NORTH) // better

50
LayoutManagers Constraints
51
LayoutManagers Another Example
  • import java.awt.
  • public class Test extends Frame
  • public Test()
  • super ("BorderLayout Demo")
  • this.setSize(200,200)
  • this.setLayout(new BorderLayout())
  • this.add (new Button ("North"),
    BorderLayout.NORTH)
  • this.add (new Button ("South"),
    BorderLayout.SOUTH)
  • this.add (new Button ("East"),
    BorderLayout.EAST)
  • this.add (new Button ("West"),
    BorderLayout.WEST)
  • this.add (new Button ("Center"),
    BorderLayout.CENTER)
  • public static void main (String args)
  • new Test().show()
  • // test

52
LayoutManager Example
  • Giving

53
BorderLayout
BorderLayout specifies the arrangement
  • To add components to a BorderLayout, specify the
    position in which the component will reside.
  • Only one component (or container) can go in each
    of the five positions.

54
BorderLayout--Example
setLayout (new BorderLayout()) add(new Label
("Hello!"), "North") Canvas myCanvas new
Canvas() // more about Canvas in a moment add
(myCanvas, "Center")
Hello!
a fresh canvas for drawing here
55
Simple Example
import java.awt. public class HelloLayout
public static void main(String args) Frame f
new Frame() f.setSize(400,400) BorderLayout
bord new BorderLayout() f.setLayout(bord) B
utton b new Button ("Hello") f.add(b,
BorderLayout.SOUTH) // HelloLayout
Will this work? Lets run it and find out...
56
(Demonstration)
57
Simple Example
import java.awt. public class HelloLayout
public static void main(String args) Frame f
new Frame() f.setSize(400,400) BorderLayout
bord new BorderLayout() f.setLayout(bord) B
utton b new Button ("Hello") f.add(b,
BorderLayout.SOUTH) f.show() //
HelloLayout
Ahh.. We forgot to set our Frame visible. Now
it works. Welcome to the exciting world of GUI
debugging.
58
LayoutManager No Constraints
  • The second type of LayoutManager does not specify
    constraints for the objects it holds.
  • Examples
  • GridLayout()
  • FlowLayout()
  • Without constraints, you cannot accurately
    predict layout behavior across platforms

59
LayoutManager No Constraints
  • import java.awt.
  • public class FlowTest extends Frame
  • String Labels "Short", "Short", "Long
    Label",
  • "Really Long Label", "Really, really
    long"
  • public FlowTest()
  • this.setSize(400,200)
  • setLayout(new FlowLayout())
  • for (int i 0 i lt Labels.length i)
  • Button temp new Button (Labelsi)
  • add (temp)
  • public static void main (String arg)
  • new FlowTest().show()
  • //class test

60
LayoutManager No Constraints
  • Yields

61
LayoutManager No Constraints
  • And also

62
Demonstration
63
LayoutManager No Constraints
  • Note
  • Since pixels, fonts and insets vary with each
    platform, layout without constraints will vary
    greatly.
  • Lesson
  • Use layout managers without constraints only when
    you have few components, or youve anticipated
    their possible movement.

64
LayoutManager No Constraints
  • Dont think that layout managers without
    constraints are not useful!
  • One of the most useful constraint-free layout
    manager is "GridLayout".
  • public GridLayout()
  • public GridLayout(int rows, int cols)
  • public GridLayout
  • (int rows, int cols, int hgap, int vgap)

65
GridLayout
GridLayout specifies a grid pattern via
setLayout (new GridLayout (rows, columns)) For
example setLayout (new
GridLayout(2,3)) generates
66
GridLayout
  • To add components (or containers) to a
    GridLayout, particular locations are not
    specified (unlike BorderLayout).
  • Instead, the components (or containers) are
    positioned by the sequence in which they are
    added, as indicated by numerals below.
  • Significantly, GridLayout is distortive(degistiri
    lebilir), meaning components are stretched to
    fill the available space in the grid.

1
2
3
4
5
6
67
GridLayout
Optionally, two additional parameters may be used
with GridLayout to specify the horizontal and
vertical spacing (in pixels) between grid
elements
setLayout (new GridLayout (rows, columns,
hspace, vspace)) where hspace specifies
horizontal size, and vspace specifies vertical
size, e.g., setLayout (new GridLayout (2,
2, 7, 5))
68
GridLayout Example
  • import java.awt.
  • public class CalcPad extends Frame
  • public CalcPad()
  • setLayout(new GridLayout(5,3))
  • int off-2,2,0
  • for (int i9 i gt 1 i--)
  • add (new Button (""(ioffi3)))
  • add (new Button ("."))
  • add (new Button ("0"))
  • add (new Button ("/-"))
  • add (new Panel())
  • public static void main (String arg)
  • CalcPad ti new CalcPad()
  • ti.setSize(150,150)
  • ti.show()
  • //CalcPad

69
Box Layout Motivation
Often, it is desirable to place items in
horizontal or vertical direction. A grid layout
may not be the best choice, since grid components
are resized to fit the available space--it
distorts its contents.
container
component
A (3, 1) grid forces size changes
Desired look
70
BoxLayout
A BoxLayout provides this feature. It
resembles a FlowLayout, but with directional
control, and other features
Horizontal and vertical flow control
71
BoxLayout How
The BoxLayout has a single constructor
BoxLayout(Container target, int axis) The
target is the container we wish to layout. The
axis is a static field
BoxLayout.X_AXIS BoxLayout.Y_AXIS JPane
l buttonPanel new JPanel() BoxLayout bLayout
new BoxLayout (buttonPanel,
BoxLayout.X_AXIS) buttonPanel.setLayout(bLayout)
72
Questions?
73
Exercise
Lets design a simple class that displays a login
prompt. No events will be handled lets just
experiment with components, containers and
layout managers.
74
Step 1 List Components
Labels
Text Fields
75
Step 2 List Containers
Panel (out container)
Panel (perhaps a grid?)
76
Step 3 Select Layouts
Grid Layout
77
Step 3 Select Layouts (contd)
BorderLayout
78
Step 4 Code
import java.awt. public class LoginPanel
extends Panel TextField password, username
Panel innerPanel public LoginPanel
() this.setLayout(new BorderLayout()) innerPa
nel new Panel() innerPanel.setLayout(new
GridLayout(2,2)) innerPanel.add(new Label("User
Name")) username new
TextField(10) innerPanel.add(username) innerP
anel.add(new Label("Password")) password new
TextField(10) innerPanel.add(password) this.a
dd(innerPanel, BorderLayout.CENTER) this.ad
d(new Label("Please Log In"), BorderLayout.NOR
TH)
79
// class LoginPanel (contd) public static void
main(String args) Frame f new
Frame() f.setSize(400,400) f.add(new
LoginPanel()) f.show() //
LoginPanel
80
Demonstration
81
Step 5 _at_!
What happened?
82
Analysis
Recall that grid layout distorts, and stretches
the cell contents to fit the maximum allowed
space.
83
Revision 1
User Name
Password
Since the grid was distortive, well wrap the
contents in an inner panel. The wrapping panel
will get stretched, but not its contents.
84
import java.awt. public class LoginPanel
extends Panel TextField password, username
Panel innerPanel public LoginPanel ()
this.setLayout(new BorderLayout()) innerPanel
new Panel() innerPanel.setLayout(new
GridLayout(2,2)) innerPanel.add(wrapInPanel(new
Label("User Name"))) username new
TextField(10) innerPanel.add(wrapInPanel(usernam
e)) innerPanel.add(wrapInPanel(new
Label("Password"))) password new
TextField(10) innerPanel.add(wrapInPanel(passwor
d)) this.add(innerPanel, BorderLayout.CENTER)
this.add(new Label("Please Log In"),
BorderLayout.NORTH) public
Panel wrapInPanel(Component c) Panel pTemp
new Panel() pTemp.setLayout(new
FlowLayout()) pTemp.add(c) return pTemp

Here, we wrap the components before adding
85
/ Revised LoginPanel class (contd) / public
static void main(String args) Frame f new
Frame() f.setSize(400,400) f.add(new
LoginPanel()) f.show() //
LoginPanel
86
Demonstration
87
Result Hmmm.
Our solution so far has been adequate for a basic
GUI. But lets see how to really solve
this problem.
This time, its the BorderLayout thats
distorting the grid panel
88
The Fix
We want the components to have their natural size
User Name
A box layout (X_AXIS) will do this.
We also want the sets of widgets to take up
their proper vertical position, as if there
were springs forcing the components away from the
top/bottom.
89
Solution
As it turns out, theres an API call for creating
this spring effect
myContainer.add (Box.createHorizontalGlue()) myC
ontainer.add(new Button ("hi"))
Hi
Horizontal glue pushes the component away
90
import java.awt. import javax.swing. public
class LoginBoxPanel extends Panel
TextField password, username public
LoginBoxPanel () password new
TextField(10) username new TextField(10) Pan
el pInner new Panel() pInner.setLayout (new
BoxLayout(pInner, BoxLayout.Y_AXIS)) Panel
pUser getPanelPair(new Label("User Name"),
username) Panel pPass getPanelPair(new
Label("Password"), password) pInner.add(p
User) pInner.add(pPass)
91
// constructor (contd)...
this.setLayout(new BoxLayout(this,
BoxLayout.Y_AXIS)) Panel prompt new
Panel() prompt.setLayout(new
FlowLayout(FlowLayout.LEFT)) prompt.add(new
Label ("Please Log In")) this.add(prompt)
this.add(Box.createVerticalGlue())
this.add(pInner) this.add(Box.createVerticalG
lue()) public Panel getPanelPair
(Component first,Component second) Panel
pTemp new Panel() pTemp.setLayout
(new BoxLayout(pTemp, BoxLayout.X_AXIS)) pTe
mp.add(first) pTemp.add(second) Panel
pWrapper new Panel() pWrapper.setLayout(new
FlowLayout()) pWrapper.add(pTemp) return
pWrapper
92
public static void main(String args)
Frame f new Frame() f.setSize(400,
200) f.add(new LoginBoxPanel()) f.show()
// main // LoginBoxPanel
93
Demonstration
94
(No Transcript)
95
Ulcer Check
Confused by the preceding? Yea, its a lot to
take in. BUT THE POINT IS THAT YOU CAN PLACE
CONTAINERS INSIDE OTHER CONTAINERS, and thereby
create a novel layout. For now, stick with the
simple layouts (e.g., the simple BorderLayout/Grid
Layout), and become comfortable with components.
96
Questions?
97
(No Transcript)
Write a Comment
User Comments (0)
About PowerShow.com