![Page 1: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/1.jpg)
Introduction to GUIs
Principles of Software Construction:
Objects, Design, and Concurrency
Jonathan Aldrich and Charlie Garrod
Fall 2014
Slides copyright 2014 by Jonathan Aldrich, Charlie Garrod,
Christian Kaestner, Jeffrey Eppinger, and William Scherlis.
Used and adapted by permission
![Page 2: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/2.jpg)
What makes GUIs different?
• How do they compare to command-line I/O?
2
![Page 3: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/3.jpg)
What makes GUIs different?
• How do they compare to command-line I/O?
Don’t call us, we’ll call you!
• GUI has to react to the user’s actions
– Not just a response to a prompt
– Could involve entirely different functionality
• Requires structuring the GUI around reacting to events3
![Page 4: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/4.jpg)
(Blocking) Interactions with Users
Game PlayerDealer
newGame
addCards
addCards
getAction
action
[action==hit] addCard
blockingexecution
![Page 5: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/5.jpg)
Interactions with Users through Events
• Do not wait for user response, react to event
• Here: Two interactions to separate events:
Game PlayerDealer
newGame
addCards
addCards
hit
addCard
![Page 6: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/6.jpg)
Event-based programming
• A style of programming where the control-flow of the
program is driven by (usually-) external events
public void performAction(ActionEvent e) {
printSlides()}
public void performAction(ActionEvent e) {
editFigure()}
public void performAction(ActionEvent e) {
…}
![Page 7: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/7.jpg)
Writing GUIs, Old-Style
7
Operating System Application
createWindow(…)
windowHandle
getNextEvent()
event
element=findGuiElement(event)
a=findAction(event, element)
a.execute()update(…)
loop
This complex code is the same for every application!
![Page 8: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/8.jpg)
Writing GUIs with GUI Frameworks
8
Operating System Framework
w = new Window(…)
windowHandle
getNextEvent()
event
element=findGuiElement(event)
a=findAction(event, element)
a.execute()
update(…)
Application
createWindow(…)
w.setVisible(true)
w.setAction(action)
update(…)
loop
![Page 9: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/9.jpg)
Pseudocode for GUIs
Application code
• Creates and sets up a window
• Asks framework to show the window
• main() exits
• Takes action in response to event
• May contact GUI
– E.g. consider if event was a redraw
– Call GUI to paint lines, text
GUI framework code
• Starts the GUI thread
• This thread loops:
– Asks OS for event
– Finds application window that event relates to
– Asks application window to handle event
– Draws lines/text on behalf of application
9
![Page 10: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/10.jpg)
Example: RabbitWorld GUI
• …hw2.staff.WorldUI.main()
– Creates a top-level JFrame window
– Creates a WorldUI to go in it
– Sets some parameters
– Makes the window (and its contents) visible
• …hw2.staff.WorldPanel.paintComponent()
– Called when the OS needs to show the WorldPanel (part of WorldUI)
• Right after the window becomes visible
– super.paintComponent() draws a background
– ImageIcon.paintIcon(…) draws each item in the world
Let’s look at the code…
10
![Page 11: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/11.jpg)
GUI Frameworks in Java
• AWT
– Native widgets, only basic components, dated
• Swing
– Java rendering, rich components
• SWT + JFace
– Mixture of native widgets and Java rendering; created for Eclipse for
faster performance
• Others
– Apache Pivot, SwingX, JavaFX, …
![Page 12: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/12.jpg)
Swing
JButton
JPanel
JTextField
…
JFrame
![Page 13: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/13.jpg)
To create a simple Swing application
• Make a Window (a JFrame)
• Make a container (a JPanel)
– Put it in the window
• Add components (Buttons, Boxes, etc.) to the container
– Use layouts to control positioning
– Set up observers (a.k.a. listeners) to respond to events
– Optionally, write custom widgets with application-specific display logic
• Set up the window to display the container
• Then wait for events to arrive…
13
![Page 14: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/14.jpg)
Components
• JLabel
• JButton
• JCheckBox
• JChoice
• JRadioButton
• JTextField
• JTextArea
• JList
• JScrollBar
• … and more
14
Swing has lots of components:
![Page 15: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/15.jpg)
JFrame & JPanel
• JFrame is the Swing Window
• JPanel (aka a pane) is the container to which you add your
components (or other containers)
15
![Page 16: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/16.jpg)
Swing Layout Managers
see http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
The simplest, and default, layout.Wraps around when out of space.
Like FlowLayout, but no wrapping
More sophisticated layout managers
![Page 17: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/17.jpg)
Find the pattern…
• contentPane.setLayout(new BorderLayout(0,0));
• contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
![Page 18: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/18.jpg)
Behavioral: Strategy
• Applicability– Many classes differ in only
their behavior
– Client needs different variants of an algorithm
• Consequences– Code is more extensible with
new strategies• Compare to conditionals
– Separates algorithm from context
• each can vary independently
– Adds objects and dynamism• code harder to understand
– Common strategy interface• may not be needed for all Strategy
implementations – may be extra overhead
![Page 19: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/19.jpg)
Example: RabbitWorld GUI
• …hw2.staff.WorldUI.WorldUI()
– Sets the layout to a BorderLayout
– Adds a WorldPanel in the CENTER of the UI
– Creates a JPanel for the buttons at the bottom
– Adds 2 buttons to the JPanel (WEST and CENTER)
– Puts the button JPanel at the SOUTH side of the WorldPanel
Let’s look at the code again…
19
![Page 20: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/20.jpg)
Question
20
How do you make a button work?
![Page 21: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/21.jpg)
Events in Swing
• An event is when something changes
– Button clicked, scrolling, mouse movement
• Swing (actually AWT) generates an event
• To do something you need to implement a Listener Interface
and register interest
21
![Page 22: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/22.jpg)
The Observer design pattern
• Applicability– When an abstraction has two
aspects, one dependent on the other, and you want to reuse each
– When change to one object requires changing others, and you don’t know how many objects need to be changed
– When an object should be able to notify others without knowing who they are
• Consequences– Loose coupling between
subject and observer, enhancing reuse
– Support for broadcast communication
– Notification can lead to further updates, causing a cascade effect
Also called Listener
ConcreteSubject
+ getState()+ setState()
subjectState
<<interface>>Observer
+ update()
ConcreteObserver
+ update()
+ observerState
for all o in observerso.update();
Subject
+ attach(o : Observer)+ detach(o : Observer)# notify()
observers
0..*
![Page 23: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/23.jpg)
Event Listeners
• ActionListener
• AdjustmentListener
• FocusListener
• ItemListener
• KeyListener
• MouseListener
• TreeExpansionListener
• TextListener
• WindowListener
• …and on and on…
23
Swing has lots of event listener interfaces:
![Page 24: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/24.jpg)
ActionListener
• Events for JButtons, JTextFields, etc
– The things we are using
• Implement ActionListener
– Provide actionPerformed method
• In actionPerformed method
– Use event.getSource() to determine which button was clicked, etc.
24
![Page 25: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/25.jpg)
Example: RabbitWorld GUI
• …hw2.staff.WorldUI.WorldUI()
– Sets ActionListeners for the run and step buttons
• Anonymous inner classes used
• A single method actionPerformed(…) is overridden
• step button: just calls step() on the WorldPanel
– Steps the world
– Requests that the window be refreshed (so the user can see the changes)
• run button
– Starts the world continuously stepping
– Disables the step button (no point!)
– Sets a toggle flag so that pressing the button again will stop the simulation
25
![Page 26: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/26.jpg)
Aside: Anonymous inner classes in Java
• You can implement an interface without naming the
implementing class
– E.g.,public interface Runnable {
public void run();}
public static void main(String[] args) {Runnable greeter = new Runnable() {
public void run() {System.out.println("Hi mom!");
}};
greeter.run();}
![Page 27: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/27.jpg)
Scope within an anonymous inner class
• An anonymous inner class cannot access non-final variables in
the scope where it is defined
public interface Runnable {public void run();
}
public static void main(String[] args) {String name = "Charlie";Runnable greeter = new Runnable() {
public void run() {System.out.println("Hi " + name);
}};
greeter.run();}
compile-time error
![Page 28: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/28.jpg)
Scope within an anonymous inner class
• An anonymous inner class cannot access non-final variables in
the scope where it is defined
public interface Runnable {public void run();
}
public static void main(String[] args) {final String name = "Charlie";Runnable greeter = new Runnable() {
public void run() {System.out.println("Hi " + name);
}};
greeter.run();}
OK
![Page 29: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/29.jpg)
Introduction to GUIs
Principles of Software Construction:
Objects, Design, and Concurrency
Jonathan Aldrich and Charlie Garrod
Fall 2014
Slides copyright 2014 by Jonathan Aldrich, Charlie Garrod,
Christian Kaestner, Jeffrey Eppinger, and William Scherlis.
Used and adapted by permission
![Page 30: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/30.jpg)
Homework Hint!
30
UI Class (imaginary) All user interaction goes here—and nothing else!
Other Classes (real)No user interaction here—all game and player state here
Only make callsthis way!
![Page 31: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/31.jpg)
GUIDemo Example
• Shows how to construct a basic UI
• Illustrates an interesting UI responsiveness issue
31
![Page 32: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/32.jpg)
The GUI Threading Architecture
32
GUI Thread
main() threadCreate window
Set up callbacks
Show window
(thread ends)
Loop forever:
Get system event
Invoke callback
Callback code:
Compute fibonacci
(UI is unresponsive)
Show result
![Page 33: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/33.jpg)
GUIDemo Example
• A fix: SwingWorker
33
![Page 34: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/34.jpg)
The GUI Threading Architecture
34
GUI thread
main() threadCreate window
Set up callbacks
Show window
(thread ends)
Loop forever:
Get system event
Invoke callback
Callback code:
create SwingWorker
start it executing
Worker thread
Worker thread execution:
invoke doInBackground()
compute fibonacci
store result in SwingWorker
signal to UI that we are done
SwingWorker
result : Long
![Page 35: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/35.jpg)
The GUI Threading Architecture
35
GUI thread
main() threadCreate window
Set up callbacks
Show window
(thread ends)
Loop forever:
Get system event
Invoke callback
Worker thread
Worker thread execution:
invoke doInBackground()
compute fibonacci
store result in SwingWorker
signal to UI that we are done
Invoke SwingWorker.done()
get() result from SwingWorker
show result in the UI
SwingWorker
result : Long
![Page 36: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/36.jpg)
Organizational Tips
• Declare references to components you’ll be manipulating as
instance variables
• Put the code that performs the actions in private “helper”
methods. (Keeps things neat)
36
![Page 37: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/37.jpg)
GUI design issues
• Interfaces vs. inheritance
– Inherit from JPanel with custom drawing functionality
– Implement the ActionListener interface, register with button
– Why this difference?
• Models and views
37
![Page 38: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/38.jpg)
GUI design issues
• Interfaces vs. inheritance
– Inherit from JPanel with custom drawing functionality
• Subclass “is a” special kind of Panel
• The subclass interacts closely with the JPanel – e.g. the subclass calls back with super()
• The way you draw the subclass doesn’t change as the program executes
– Implement the ActionListener interface, register with button
• The action to perform isn’t really a special kind of button; it’s just a way of reacting to the button. So it makes sense to be a separate object.
• The ActionListener is decoupled from the button. Once the listener is invoked, it doesn’t call anything on the Button anymore.
• We may want to change the action performed on a button press—so once again it makes sense for it to be a separate object
• Models and views
38
![Page 39: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/39.jpg)
Model-View-Controller (MVC)
http://msdn.microsoft.com/en-us/library/ff649643.aspx
Manage inputs from user: mouse, keyboard, menu, etc.
Manage display of information on the screen
Manage data related to the application domain
![Page 40: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/40.jpg)
Model-View-Controller (MVC)Passive model
Active model
http://msdn.microsoft.com/en-us/library/ff649643.aspx
![Page 41: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/41.jpg)
Example: RabbitWorld GUI
• …hw2.lib.ui.WorldImpl
– The Model class
– Model is passive: does not have a reference to the view
• …hw2.lib.ui.WorldUI
– The Controller class
– Listener callbacks in constructor react to events
• Delegating to the view (is this design ideal?)
• …hw2.lib.ui.WorldPanel
– The View class
– Gets data from Model to find out where to draw rabbits, foxes, etc.
– Implements stepping (in step())
• Invokes model to update world
• Invokes repaint() on self to update UI
41
![Page 42: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/42.jpg)
Find That Pattern!
• What pattern is BorderLayout a part of?
• What pattern is JPanel a part of?
• What pattern are the ActionListeners part of?
• There are classes representing the AI’s decision to Eat, Breed,
or Move. What pattern are these representing?
• Look at the documentation for JComponent.paint(). What
pattern is used?
42
![Page 43: Introduction to GUIs · GUI Frameworks in Java • AWT – Native widgets, only basic components, dated • Swing – Java rendering, rich components • SWT + JFace – Mixture of](https://reader034.vdocuments.mx/reader034/viewer/2022042708/5f3aca5c5a4391241e43b258/html5/thumbnails/43.jpg)
For More Information
• Oracle’s Swing tutorials
– http://download.oracle.com/javase/tutorial/uiswing/
• Introduction to Programming Using Java, Ch. 6
– http://math.hws.edu/javanotes/c6/index.html
43