Jonathan Aldrich Charlie Garrod

Similar documents
Chris9an Kästner Charlie Garrod

Introduction to concurrency and GUIs

Introduction to GUIs. Principles of Software Construction: Objects, Design, and Concurrency. Jonathan Aldrich and Charlie Garrod Fall 2014

Charlie Garrod Michael Hilton

Charlie Garrod Bogdan Vasilescu

Design Case Study: GUI with Swing (2)

Design Case Study: GUI with Swing

Java: Graphical User Interfaces (GUI)

Graphical User Interface (GUI)

Control Flow: Overview CSE3461. An Example of Sequential Control. Control Flow: Revisited. Control Flow Paradigms: Reacting to the User

CS11 Java. Fall Lecture 4

CSE 143. Event-driven Programming and Graphical User Interfaces (GUIs) with Swing/AWT

Systems Programming Graphical User Interfaces

Graphical User Interface (GUI)

Graphical interfaces & event-driven programming

Introduction to the JAVA UI classes Advanced HCI IAT351

Graphical User Interfaces (GUIs)

Packages: Putting Classes Together

Frames, GUI and events. Introduction to Swing Structure of Frame based applications Graphical User Interface (GUI) Events and event handling

The JFrame Class Frame Windows GRAPHICAL USER INTERFACES. Five steps to displaying a frame: 1) Construct an object of the JFrame class

CSE 331 Software Design & Implementation

Window Interfaces Using Swing Objects

Programming Languages and Techniques (CIS120)

PROGRAMMING DESIGN USING JAVA (ITT 303) Unit 7

CSE 331 Software Design and Implementation. Lecture 19 GUI Events

Lecture 19 GUI Events

CSEN401 Computer Programming Lab. Topics: Graphical User Interface Window Interfaces using Swing

Graphical User Interfaces. Swing. Jose Jesus García Rueda

All the Swing components start with J. The hierarchy diagram is shown below. JComponent is the base class.

Window Interfaces Using Swing Objects

GUI Programming. Chapter. A Fresh Graduate s Guide to Software Development Tools and Technologies

Building Graphical User Interfaces. GUI Principles

CS11 Java. Fall Lecture 3

Starting Out with Java: From Control Structures Through Objects Sixth Edition

Topic 9: Swing. Swing is a BIG library Goal: cover basics give you concepts & tools for learning more

Topic 9: Swing. Why are we studying Swing? GUIs Up to now: line-by-line programs: computer displays text user types text. Outline. 1. Useful & fun!

CSE 331. Event-driven Programming and Graphical User Interfaces (GUIs) with Swing/AWT

Graphic User Interfaces. - GUI concepts - Swing - AWT

Course Status Networking GUI Wrap-up. CS Java. Introduction to Java. Andy Mroczkowski

Handout 14 Graphical User Interface (GUI) with Swing, Event Handling

SELF-STUDY. Glossary

GUI Software Architecture

Java Programming Lecture 6

EPITA Première Année Cycle Ingénieur. Atelier Java - J5

Graphics programming. COM6516 Object Oriented Programming and Design Adam Funk (originally Kirill Bogdanov & Mark Stevenson)

G51PGP Programming Paradigms. Lecture 008 Inner classes, anonymous classes, Swing worker thread

Outline. Topic 9: Swing. GUIs Up to now: line-by-line programs: computer displays text user types text AWT. A. Basics

KF5008 Program Design & Development. Lecture 1 Usability GUI Design and Implementation

Heavyweight with platform-specific widgets. AWT applications were limited to commonfunctionality that existed on all platforms.

CONTENTS. Chapter 1 Getting Started with Java SE 6 1. Chapter 2 Exploring Variables, Data Types, Operators and Arrays 13

CS 251 Intermediate Programming GUIs: Components and Layout

Graphical User Interfaces. Comp 152

Part I: Learn Common Graphics Components

Design for large-scale reuse: Libraries and frameworks

Java & Graphical User Interface II. Wang Yang wyang AT njnet.edu.cn

Building Graphical User Interfaces. Overview

Java IDE Programming-I

PIC 20A GUI with swing

CS 251 Intermediate Programming GUIs: Event Listeners

Java Swing. Recitation 11/(20,21)/2008. CS 180 Department of Computer Science, Purdue University

GUI Event Handlers (Part I)

GUI Program Organization. Sequential vs. Event-driven Programming. Sequential Programming. Outline

Java Swing. based on slides by: Walter Milner. Java Swing Walter Milner 2005: Slide 1

CS 2113 Software Engineering

Swing. By Iqtidar Ali

1005ICT Object Oriented Programming Lecture Notes

Welcome to CIS 068! 1. GUIs: JAVA Swing 2. (Streams and Files we ll not cover this in this semester, just a review) CIS 068

Chapter 8. Java continued. CS Hugh Anderson s notes. Page number: 264 ALERT. MCQ test next week. This time. This place.

Overview. Building Graphical User Interfaces. GUI Principles. AWT and Swing. Constructing GUIs Interface components GUI layout Event handling

Java continued. Chapter 8 ALERT ALERT. Last week. MCQ test next week. This time. This place. Closed book. Assignment #2 is for groups of 3

Programming Languages and Techniques (CIS120e)

Class 16: The Swing Event Model

Example Programs. COSC 3461 User Interfaces. GUI Program Organization. Outline. DemoHelloWorld.java DemoHelloWorld2.java DemoSwing.

2110: GUIS: Graphical User Interfaces

Charlie Garrod Michael Hilton

Lab 4. D0010E Object-Oriented Programming and Design. Today s lecture. GUI programming in

Charlie Garrod Bogdan Vasilescu

Lecture 5: Java Graphics

GUI Basics. Object Orientated Programming in Java. Benjamin Kenwright

CSE 331. Event- driven Programming and Graphical User Interfaces (GUIs) with Swing/AWT

Graphics. Lecture 18 COP 3252 Summer June 6, 2017

Programming graphics

Widgets. Overview. Widget. Widgets Widget toolkits Lightweight vs. heavyweight widgets Swing Widget Demo

Java Graphical User Interfaces AWT (Abstract Window Toolkit) & Swing

Lecture 9. Lecture

TYPES OF INTERACTORS Prasun Dewan Department of Computer Science University of North Carolina at Chapel Hill

COMPSCI 230. Software Design and Construction. Swing

Design for Large-Scale Reuse: Libraries and Frameworks

DM550 / DM857 Introduction to Programming. Peter Schneider-Kamp

Window Interfaces Using Swing. Chapter 12

UI Software Organization

Overview. Lecture 7: Inheritance and GUIs. Inheritance. Example 9/30/2008

(Incomplete) History of GUIs

Advanced Java Programming. Swing. Introduction to Swing. Swing libraries. Eran Werner, Tel-Aviv University Summer, 2005

Lecture 3: Java Graphics & Events

CPS122 Lecture: Graphical User Interfaces and Event-Driven Programming

Lecture 18 Java Graphics and GUIs

Goals. Lecture 7 More GUI programming. The application. The application D&D 12. CompSci 230: Semester JFrame subclass: ListOWords

Sri Vidya College of Engineering & Technology

Virtualians.ning.pk. 2 - Java program code is compiled into form called 1. Machine code 2. native Code 3. Byte Code (From Lectuer # 2) 4.

Transcription:

Principles of Software Construction: Objects, Design, and Concurrency (Part 3: Design Case Studies) Introduction to GUIs Jonathan Aldrich Charlie Garrod School of Computer Science 1

Administrivia Homework 4a due tonight Homework 4b due Thursday, October 22 2

Key concepts from Tuesday 3

Key concepts from Tuesday Formal verification Testing Coverage metrics Black-box vs. white-box testing Static analysis 4

Key concepts from recitation yesterday 5

Key concepts from yesterday's recitation Discovering design patterns The Observer pattern 6

The Observer design pattern 7

The Observer design pattern Applicability When an abstraction has two interdependent aspects and you want to reuse both When state change to one object requires notifying others, without becoming dependent on them Consequences Loose coupling between subject and observer, enhancing reuse Support for broadcast communication Notification can lead to further updates, causing a cascade effect 8

Learning goals for today Understand the design challenges and common solutions for Graphical User Interfaces (GUIs) Understand event-based programming Understand and recognize the design patterns used and how those design patterns achieve design goals. Observer pattern Strategy pattern Template method pattern Composite pattern Model-view-controller Other common GUI design patterns not discussed here: Decorator, Façade, Adapter, Command, Diagnose problems caused by computation in the GUI threads 9

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(); 10

Scope within an anonymous inner class An anonymous inner class can access final (or effectively 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"; // final variable Runnable greeter = new Runnable() { public void run() { System.out.println("Hi " + name); } }; } greeter.run(); OK 11

Scope within an anonymous inner class An anonymous inner class can access final (or effectively final) variables in the scope where it is defined public interface Runnable { public void run(); } public static void main(string[] args) { String name = "Charlie"; // not final, but could be Runnable greeter = new Runnable() { public void run() { System.out.println("Hi " + name); } }; } greeter.run(); OK 12

Scope within an anonymous inner class An anonymous inner class can access final (or effectively final) variables in the scope where it is defined public interface Runnable { public void run(); } public static void main(string[] args) { String name = "Charlie"; // not final; assigned later Runnable greeter = new Runnable() { public void run() { System.out.println("Hi " + name); } }; } name = Jonathan ; greeter.run(); Compile-time error 13

Today: Introduction to Graphical User Interfaces (GUIs) Event-based programming Building a GUI using Java Swing Event-handling and decoupling with the Observer pattern GUI design challenges Design patterns that solve them Practical advice: Threading architecture of a typical GUI 14

Event-based programming Style of programming where control-flow is driven by (usually external) events public void performaction(actionevent e) { List<String> lst = Arrays.asList(bar); foo.peek(42) } public void performaction(actionevent e) { bigbloatedpowerpointfunction(e); withanamesolongimadeittwomethods(e); yesiknowjavadoesntworklikethat(e); } public void performaction(actionevent e) { List<String> lst = Arrays.asList(bar); foo.peek(40) } 15

Examples of events in GUIs 16

Examples of events in GUIs User clicks a button, presses a key User selects an item from a list, an item from a menu, expands a tree Mouse hovers over a widget, focus changes Scrolling, mouse wheel turned Resizing a window, hiding a window Drag and drop A package arrives from a web service, connection drops, System shutdown, 17

Interaction with command-line interfaces Scanner input = new Scanner(System.in); while (questions.hasnext()) { Question q = question.next(); System.out.println(q.toString()); String answer = input.nextline(); q.respond(answer); } 18

GUIs without event-based programming while (true) { if (iskeydown( Alt+Q ) break; if (iskeydown( F1 ) openhelp(); if (ismousedown(10 ) startmovingwindow(); } 19

Event-based GUIs //static public void main JFrame window = window.setdefaultcloseoperation( WindowConstants.EXIT_ON_CLOSE); window.setvisible(true); //on add-button click: String email = emailfield.gettext(); emaillist.add(email); 20

Event-based GUIs //static public void main JFrame window = window.setdefaultcloseoperation( WindowConstants.EXIT_ON_CLOSE); window.setvisible(true); //on add-button click: String email //on = remove-button click: emailfield.gettext(); int pos = emaillist.add(email); emaillist.getselecteditem(); if (pos>=0) emaillist.delete(pos); 21

(Blocking) Interactions with users Game Dealer Player newgame addcards addcards getaction action blocking execution [action==hit] addcard 22

Interactions with users through events Do not block waiting for user response Instead, react to user events e.g.: Game Dealer Player newgame addcards addcards hit addcard 23

Programming an event-based GUI Typically use a GUI framework Register code (a.k.a. callbacks) to handle different events Operating system / GUI framework detects events Determines which components are registered to handle the event and calls the event handlers Your code is idle until called to handle events Program exits by calling some exit method Application event mouse, key, redraw, GUI Framework drawing commands get event next event OS 24

Programming an event-based GUI Setup phase Describe how the GUI window should look Use libraries for windows, widgets, and layout Embed specialized code for later use Register callbacks Execution Framework gets events from OS Raw events: mouse clicks, key presses, window becomes visible, etc. Framework processes events Click at 10,40: which widget? Resize window: what to re-layout and redraw? Triggers callback functions of corresponding widgets (if registered) Application event mouse, key, redraw, GUI Framework get event OS drawing commands next event 25

Example: The AlarmWindow edu.cmu.cs.cs214.rec06.alarmclock.alarmwindow Creates a JFrame with a JPanel to go in it Creates a text label and a button Makes the window (and its contents) visible when the alarm goes off When the dismiss button is clicked, its event handler hides the window 26

Example: The CustomerManagementUI rec06.customerlist.gui.customermanagementui Creates a JFrame with a JPanel to go in it Makes the window (and its contents) visible...rec06.customerlist.gui.customermanagementpanel Creates numerous labels and text fields, a customeraddbutton Registers an event handler for the customeraddbutton When the customeraddbutton is clicked, its event handler gets the text from the text fields and adds a customer to the list 27

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, Different in their specific designs, but similar overall strategies and concepts 28

Swing JFrame JPanel JButton JTextField 29

Swing has many widgets JLabel JButton JCheckBox JChoice JRadioButton JTextField JTextArea JList JScrollBar and more JFrame is the Swing Window JPanel (aka a pane) is the container to which you add your components (or other containers) 30

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 31

Reacting to events 32

Creating a button //static public void main JFrame window = JPanel panel = new JPanel(); window.setcontentpane(panel); JButton button = new JButton( Click me ); button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println( Button clicked ); } }); panel.add(button); window.setvisible(true); 33

Creating a button //static public void main JFrame window = JPanel panel = new JPanel(); window.setcontentpane(panel); panel to hold the button JButton button = new JButton( Click me ); button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println( Button clicked ); } }); panel.add(button); window.setvisible(true); 34

ActionListeners Listeners are objects with callback functions Listeners can be registered to handle events on widgets All registered widgets are called if event occurs interface ActionListener { void actionperformed(actionevent e); } class ActionEvent { int when; String actioncommand; int modifiers; Object source(); int id; } 35

ActionListeners Listeners are objects with callback functions Listeners can be registered to handle events on widgets All registered widgets are called if event occurs interface ActionListener { void actionperformed(actionevent e); } class ActionEvent { class AbstractButton extends JComponent int { when; String actioncommand; private List<ActionListener> listeners; int modifiers; public void addactionlistener(actionlistener l) { Object source(); listeners.add(l); int id; } protected void fireactionperformed(actionevent } e) { for (ActionListener l: listeners) l.actionperformed(e); } } 36

ActionListeners What design pattern is this? Listeners are objects with callback functions Listeners can be registered to handle events on widgets All registered widgets are called if event occurs interface ActionListener { void actionperformed(actionevent e); } class ActionEvent { class AbstractButton extends JComponent int { when; String actioncommand; private List<ActionListener> listeners; int modifiers; public void addactionlistener(actionlistener l) { Object source(); listeners.add(l); int id; } protected void fireactionperformed(actionevent } e) { for (ActionListener l: listeners) l.actionperformed(e); } } 37

Recall the observer design pattern 38

Design discussion Button implementation should be reusable but customizable Different button label, different event-handling Must decouple button's action from the button itself Listeners are separate independent objects A single button can have multiple listeners Multiple buttons can share the same listener 39

Swing has many event listener interfaces: ActionListener AdjustmentListener FocusListener ItemListener KeyListener MouseListener TreeExpansionListener TextListener WindowListener and on and on interface ActionListener { void actionperformed(actionevent e); } class ActionEvent { int when; String actioncommand; int modifiers; Object source(); 40

Decoupling from a GUI 41

A GUI design challenge Consider the transit simulator, implemented by a World class: Simulator World stores all entities GUI shows entities, triggers new events in simulator When should the GUI update the screen? World GUI step getdata update 42

A GUI design challenge, part 2 What if we add a warning to alert if a bus has moved? World GUI Warning step getdata update update getdata update 43

A GUI design challenge, part 3 What if the simulator world changes for reasons not caused by the GUI? World GUI Warning step getdata update update getdata update 44

A GUI design challenge, part 3: one possible design Let the World tell the GUI that something happened World GUI Warning step update(data) update(data) update update 45

A GUI design challenge, part 3: one possible design Let the World tell the GUI that something happened World GUI Warning step update(data) update(data) update update Problem: This couples the World to the GUI implementation. 46

Core implementation vs. GUI Core implementation: Application logic GUI Computing some result, updating data Graphical representation of data Source of user interactions Design guideline: Avoid coupling the GUI with core application Multiple UIs with single core implementation Test core without UI Design for change, design for reuse, design for division of labor; low coupling, high cohesion 47

A GUI design challenge, part 3: one possible design Let the World tell the GUI that something happened World GUI Warning step update(data) update(data) update update Problem: This couples the World to the GUI implementation. 48

Decoupling with the Observer pattern Let the world tell all interested components about updates World GUI Warning register register step notify notify update update 49

An architectural pattern: Model-View-Controller (MVC) Manage inputs from user: mouse, keyboard, menu, etc. Manage display of information on the screen Manage data related to the application domain 50

Model-View-Controller (MVC) Passive model Active model http://msdn.microsoft.com/en-us/library/ff649643.aspx 51

Separating application core and GUI, a summary Reduce coupling: do not allow core to depend on UI Create and test the core without a GUI Use the Observer pattern to communicate information from the core (Model) to the GUI (View) GUI Tests GUI Core Tests Core 52

More GUI design challenges 53

Swing layouts The simplest, and default, layout. Wraps around when out of space. Like FlowLayout, but no wrappin More sophisticated layout managers see http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html 54

A naïve hard-coded implementation class JPanel { protected void dolayout() { switch(getlayouttype()) { case BOX_LAYOUT: adjustsizebox(); break; case BORDER_LAYOUT: adjustsizeborder(); break;... } } private adjustsizebox() { } } A new layout would require changing or overriding JPanel 55

A better solution: delegate the layout responsibilities Layout classes, e.g.: contentpane.setlayout(new FlowLayout()); contentpane.setlayout(new GridLayout(4,2)); Similarly, there are border classes to draw the borders, e.g.: contentpane.setborder(new EmptyBorder(5, 5, 5, 5)); What design pattern is this? 56

Recall the strategy pattern 57

Another GUI design challenge: nesting containers A JFrame contains a JPanel, which contains a JPanel (and/or other widgets), which contains a JPanel (and/or other widgets), which contains What design pattern best models this? 58

Recall the composite design pattern 59

Yet another GUI design challenge: partial customization JComponent. 60

Recall the template method pattern Applicability When an algorithm consists of varying and invariant parts that must be customized When common behavior in subclasses should be factored and localized to avoid code duplication To control subclass extensions to specific operations Consequences Code reuse Inverted Hollywood control: don t call us, we ll call you Ensures the invariant parts of the algorithm are not changed by subclasses 61

The Swing threading architecture main() thread Create window Set up callbacks Show window (thread ends) GUI thread Loop forever: Get system event Invoke callback e.g. callback code: Run complex numeric algorthim (Problem: UI is unresponsive) Show result 62

The Swing threading architecture: worker threads main() thread Create window Set up callbacks Show window (thread ends) GUI thread Loop forever: Get system event Invoke callback Callback code: create SwingWorker start it executing Worker thread Worker thread execution: invoke doinbackground() run complex numeric algorithm store result in SwingWorker signal to UI that we are done SwingWorker result : Long 63

Summary GUIs are full of design patterns Strategy pattern Template Method pattern Composite pattern Observer pattern Decorator pattern Façade pattern Adapter pattern Command pattern Model-View-Controller Swing for Java GUIs Separation of GUI and Core 64