Top Banner
Advanced Swing GUI Programming Kyle Brown Kyle Brown Executive Java Consultant Executive Java Consultant IBM WebSphere Services IBM WebSphere Services RTP, NC RTP, NC [email protected] [email protected] 1
47

Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

Aug 14, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

Advanced Swing GUI Programming

Kyle BrownKyle BrownExecutive Java ConsultantExecutive Java ConsultantIBM WebSphere ServicesIBM WebSphere ServicesRTP, NCRTP, [email protected]@us.ibm.com

1

Page 2: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Overview

ICM Architecture and Swing

GUI Builders and Swing

In-depth Video Store ExampleTable modelsList Models

2

Page 3: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Layered Architecture

Compared to OO Design, little has been written about OO Architectures

An Architecture is a general layout of a program. Shows how all the pieces fit together

A Layered architecture is the most commonProvides built-in enhanceability and easy reuse.Provides a structure for project planning and estimation

3

An exception would be the remarkable work of Shaw and Garlen. Also included (IMHO) would be the patter work by Buschmann, et. al.Layered architectures are common in telecommunications (the OSI model), operating systems (e.g. Mach and Kernel architectures) and control systems.

Page 4: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

What is a layer?

A Layer is a set of interacting objects that perform a common set of tasks

presents a unified interface to the outside world

Objects in a layer may collaborate with objects that are in layers below them

Objects should not collaborate with objects in higher layers.They may collaborate with other objects in the same layer

4

Page 5: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

ICM Architecture

ICM is a simple layered architecture for business systems

Separates the Interface from the Control from the Model

Interface

Control

Model

5

Page 6: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Layer Definitions

InterfaceWhere windows (Frames) live. Contains GUI Components from an application builder palette. Often generated code.

Control LayerServes to adapt the protocol of the GUI layer to that of the domain layer.Manages the interaction of the pieces of an interface

6

Page 7: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Layer Definitions (2)

Domain model LayerThe meat of the applicationMost of the objects found in OOA&D.

Infrastructure Layersupports the domain modeldatabases, comms, etc.

7

Page 8: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Why do you need a Control layer?

Many tools like Visual Basic do not support a separate Application layer

they mix GUI code with domain code indiscriminately

So why do you need it?It separates the semantics of the application from the details (syntax) of the particular GUIIt allows you to implement the same application with different interfaces

Applets, Applications,Servlets

8

Page 9: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Building an Application

Applications should be built like a sandwichStart with the meat, then work out to the bun.

9

Page 10: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Application Building Steps

Step 1: Build an initial domain layercode the domain objects firsttest them in-place with a test skeleton

Step 2: Build an initial GUIdraw the appropriate windowsor construct them from scratch (painful!)

10

In step 1 you can make yourself certain your business logic is correct and that your abstractions are the right onesIn an iterative process you stop here and assess risks for the next stage -- often involves reworking your design!In step 2 you will usually find that you missed some model abstractions -- iterate!

Page 11: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Application Building Steps (2)

Step 3: Build a Control layerutilize the Adapter and Mediator patternsutilize the rules for Controllersthese should be separate objects from the Applets or Frames except in VERY trivial cases

Step 4: Build the infrastructure layerstart smallmicrolayer the infrastructure

Step 5: Go back to Step 1 and Iterate!

11

Page 12: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Controller Rules

Rule 1: Keep your app models small and thinfew instance variables (< 3 if possible)most state should be kept in the domain modelas few methods as possible

12

A layered approach encourages this. In general, methods should be very short; if a method is getting long it probably belongs in the domain model.

Page 13: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Controller Rules

Rule 2: Keep your app models dumb!Mediate and Adapt

do not take over the Model’s responsibilities!

If it doesn’t mediate or adapt, move it out!do not take over the Model’s responsibilities!

13

Page 14: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

GUI Builders

While it is possible to build Swing interfaces by hand I don't recommend it

No human should have to understand GridBagLayout

Many GUI builder tools (VisualAge for Java, Visual Cafe, Forte for Java) can handle building Swing GUI's

you can mix generated code (for simple things) with hand-written code for complex things

14

An easy trap to fall into is to let your GUI builder try to do everything! Unfortunately, many GUI builders subtly encourage this.Remember you want to LAYER your application. Just draw the window in the GUI builder and then drop down to code for the guts of the application.

Page 15: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

VisualAge for Java

Fully featured Java IDECompiler & Debugging

Visual & Non-visual BeansAWT / Swing / JFCDataAccess Bean

(Select)Enterprise Beans

Visual LayoutVisual Composition (visual programming)

15

My advice -- ignore all of the visual programming parts. Don't use the data access beans or enterprise beans in visual programming. Just use the Visual Composition Editor for page layout, and then have code for event handlers call down into the Controller layerThis is usually simpler and more easily ported.

Page 16: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Video Store Example

Now we will examine ICM in the context of the Video Store Example

Basic design issuesController Design issuesUsing a GUI builder with SwingAdvanced Swing Programming issues

16

Page 17: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Layers and Package names

Package names should be based on the layer they contain

Also include standard organization, project information in the nameSee [Woolf] for more details

edu.ncsu.examples.video.ui edu.ncsu.examples.video.tests

edu.ncsu.examples.video.model

edu.ncsu.examples.video.factories

17

Page 18: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Video Store Design Overview

VCCustomer

VCAddress

VCMovie

VCVideoTape

VCCategory

VCCustomerTransaction

VCTapeRental

VCCustomerFactory VCMovieFactory

VCVideoTapeFactory VCCategoryFactory

*

*

*

*

*

*

18

Page 19: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Video Store Design Overview (2)

VideoStoreWindow

JFrame

JTabbedPane

JPanel

CheckoutPanel

MovieSearchPanel

VideoReturnPanel

CheckoutController

MovieSearchController

VideoReturnController

Interface Layer Objects Control Layer Objects

19

Page 20: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Controller-Interface connection

In our case, each UI knows its associated controller

held in a variable named "controller" added to the Panel

The Panels receive event notifications, pass control to the controllers

keeps the Interface layer from implementing model or control layer behaviorPanels communicate with controllers in terms of simple Java types

20

Page 21: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

VideoReturnPanel

Tape#

Return Tape

JLabel

MessageLineLabel (JLabel)

TapeNumberTextField (JTextField)

ReturnButton (JButton)

21

Page 22: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

VideoReturnPanel Code

public class VideoReturnPanel extends JPanel {public VideoReturnController controller = new VideoReturnController();

...public void returnButtonPressed() {

// This message is invoked by an ActionEvent Handler (not shown)String tapeId = getTapeNumberTextField().getText();try {

getController().returnVideo(tapeId);getMessageLineLabel().setText("Tape " + tapeId + " returned.");

} catch (edu.ncsu.examples.video.model.DuplicateTapeReturnException e) {getMessageLineLabel().setText("Cannot return duplicate tape; Check number.");

}}...}

22

Page 23: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

VideoReturnController Code

/* The tape id obtained from the tape id TextField is passed in as a String */public void returnVideo(String tapeId) throws DuplicateTapeReturnException {

int id = Integer.parseInt(tapeId);VCVideoTape tape = VCVideoTapeFactory.getInstance().getTapeForId(id);tape.returnTape();

}

23

Page 24: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

MovieSearchPanel

Title: Search

Remove

JLabel MovieTitleEntryField (JTextField) Search Button (JButton)

RemoveButton (JButton)

JScrollPane

TapeListingTable (JTable)

TapeNumberColumn(TableColumn)

LocationColumn(TableColumn)

DueDateColumn(TableColumn)

24

Page 25: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Movie Search Design

MovieSearchPanel MovieSearchController

TapeTableModel

AbstractTableModel tableModel

controller

VCMovieFactory

VCMovie

VCVideoTape

movie

Interface Layer Objects

Control Layer Objects

Model Layer Objects

25

Page 26: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

MovieSearchPanel Code

private javax.swing.JTable getTapeListingTable() {if (ivjTapeListingTable == null) {

ivjTapeListingTable = new javax.swing.JTable();ivjTapeListingTable.setName("TapeListingTable");getJScrollPane2().setColumnHeaderView(ivjTapeListingTable.getTableHeader());getJScrollPane2().getViewport().setBackingStoreEnabled(true);ivjTapeListingTable.setAutoResizeMode(0);ivjTapeListingTable.setPreferredSize(new java.awt.Dimension(200,200));ivjTapeListingTable.setBounds(0, 0, 200, 200);ivjTapeListingTable.setAutoCreateColumnsFromModel(false);ivjTapeListingTable.addColumn(getTapeNumberColumn());ivjTapeListingTable.addColumn(getLocationColumn());ivjTapeListingTable.addColumn(getDueDateColumn());// user code begin {1}ivjTapeListingTable.setModel(getController().getTableModel());// user code end

}return ivjTapeListingTable;

}

26

Page 27: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

MovieSearchPanel Code

private javax.swing.table.TableColumn getLocationColumn() {if (ivjLocationColumn == null) {

ivjLocationColumn = new javax.swing.table.TableColumn();ivjLocationColumn.setModelIndex(1);ivjLocationColumn.setWidth(104);ivjLocationColumn.setHeaderValue("Location");// user code begin {1}// user code end

}return ivjLocationColumn;

}

27

Page 28: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

TapeListingTable Code

public class TapeTableModel extends AbstractTableModel {public VCMovie movie = new VCMovie();

/* Would have getters/setters for movie */

public int getRowCount() {if (getMovie() != null)

return movie.getTapes().size();else

return 0;}

}

28

Page 29: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

TapeListingTable Code (2)

public Object getValueAt(int row, int col) {VCVideoTape tape = (VCVideoTape) getMovie().getTapes().elementAt(row);switch (col) {

case 0: // tape numberreturn Integer.toString(tape.getTapeNumber());

case 1: // rented or on shelfif (tape.isRented()) return "Rented";else return "On Shelf";

case 2: // due back dateif (tape.isRented()) {

java.util.Date rDate = tape.getCurrentRental().getDueDate();return java.text.DateFormat.getInstance().format(rDate);

}else return "N/A";

default: // should never happenreturn null;

}}

29

Page 30: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

MovieSearchPanel Code (2)

public void searchButtonPressed() { // called from an ActionEvent handler (not shown)

String entry = getMovieTitleEntryField().getText();controller.findMovie(entry);refresh();

}

public void refresh() {getTapeListingTable().repaint();

}

30

Page 31: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

MovieSearchController Code

public void findMovie(String entry) {try {

VCMovie movie = VCMovieFactory.getInstance().findMovieForTitle(entry);getTableModel().setMovie(movie);

} catch (NoSuchElementException e) {System.out.println("no movie found");

}}

31

Page 32: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

JOptionPane

JOptionPane is the Swing "MessageBox" classIt allows you to construct simple dialogs with OK, YES, NO, CANCEL optionsAlso allows simple selection from a drop-down

There are multiple show(Input,Confirm)Dialog methods to display these

take as an argument the combination of button options

32

Page 33: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

MovieSearchPanel Code (3)/** * Called from an ActionEvent handler (not shown) */public void removeButtonPressed() {

JRootPane root = getRootPane();JOptionPane option = new JOptionPane();int selection =

option.showConfirmDialog(root, "This operation cannot be undone. Proceed?", "Remove video tape", option.YES_NO_OPTION);

if (selection == option.YES_OPTION) {int index = getTapeListingTable().getSelectedRow();getController().removeTape(index);

}}

33

Page 34: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Tape Removal Code

public void removeTape(int index) {getTableModel().getMovie().removeMovie(index);getTableModel().removeElement();

}

public void removeElement() {fireTableRowsDeleted(-1, -1);

}

MovieSearchController Code

TapeTableModel Code

34

Page 35: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

CheckoutPanel

Customer# Customer

Customer Name:

Tape# Add Tape

Sales Tax:Total: Checkout

LineItemList(JList)

JScrollPane

CustomerNameLabel

SalesTaxLabel

TotalDueLabel

FindCustomerButton

AddTapeButton

CheckoutButton

CustomerNameTextField TapeNumberTextField

35

Page 36: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Checkout Design

CheckoutPanel CheckoutController

CheckoutListModel

AbstractListModel listModel

controller

VCCustomer

VCCustomerTransaction

VCTapeRental

transaction

transaction

customer

VCCustomerFactory

36

Page 37: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

CheckoutPanel Code

private javax.swing.JList getLineItemList() {if (ivjLineItemList == null) {

ivjLineItemList = new javax.swing.JList();ivjLineItemList.setName("LineItemList");ivjLineItemList.setBounds(0, 0, 160, 120);// user code begin {1}ivjLineItemList.setModel(getController().getListModel());// user code end

}return ivjLineItemList;

}

public void findCustomerButtonPressed() {String customerNumber = getCustomerNameTextField().getText();getController().findCustomer(customerNumber);refresh();

}

37

Page 38: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

CheckoutPanel Code (2)

public void refresh() {// force the list to refresh.

getLineItemList().repaint();// force the sales tax to refresh

String formattedTax = getController().getSalesTax();getSalesTaxLabel().setText(formattedTax);

// force the total to refreshString formattedTotal = getController().getTotalDue();getTotalLabel().setText(formattedTotal);

// force the customer name to refreshString customerName = getController().getCustomerName();getCustomerNameLabel().setText(customerName);

}

38

Page 39: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

CheckoutController Code

public void findCustomer(String customerNumber) {int cNum = Integer.parseInt(customerNumber);VCCustomer customer =

VCCustomerFactory.getInstance().getCustomerForId(cNum);setCustomer(customer);

VCCustomerTransaction tran = new VCCustomerTransaction();tran.setCustomer(customer);tran.getOverdueTapes(); // add overdue tapes immediatelysetTransaction(tran);getListModel().setTransaction(tran);

}

39

Page 40: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Adding Code

/* This is invoked from the Panel similarly to the previous examples */

public void addTape(String tapeNumber) {int tapeNum = Integer.parseInt(tapeNumber);getTransaction().addTapeForId(tapeNum);getListModel().addElement(null);

}

CheckoutController code

CheckoutListModel codepublic void addElement(Object element) {

fireContentsChanged(this, -1, -1); }

40

Page 41: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

CheckoutListModel Code

public int getSize() {if (getTransaction() != null) {

return getTransaction().getRentals().size();}else

return 0;}

41

Page 42: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

CheckoutListModel Code (2)public Object getElementAt(int index) {

VCTapeRental rental = (VCTapeRental) getTransaction().getRentals().elementAt(index);StringBuffer buff = new StringBuffer(50);buff.append(NumberFormat.getCurrencyInstance().format(rental.getFeeOrFine()));if (rental.isOverdue()) {

buff.append(" OVERDUE FINE -- ");buff.append(rental.getTape().getMovie());buff.append(" ");buff.append(rental.getOverdueDays());buff.append("DAYS LATE");

} else {buff.append(" RENTAL ");buff.append(rental.getTape().getMovie().getTitle());buff.append(" DUE BACK ");buff.append(DateFormat.getInstance().format(rental.getDueDate()));

}return buff.toString();

}

42

Page 43: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Advanced Controller Topics

Sometimes a bidirectional UI/controller link is necessary

Want to minimize coupling between layersShould try to make it unidirectional if you can

Panel Controller

controller

ui

43

Page 44: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Advanced Topics (2)

Often Controllers will have subcontrollersParallels a Frame/Panel relationshipAllows the top Controller to delegate some work

Frame

Panel Panel

Controller

Controller Controller

44

Page 45: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

Summary

We've seen:How Layering is applied in the ICM architectureAn example of ICM with Swing in the Video Store

45

Page 46: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

References

Erich Gamma, "Design Patterns: Elements of Reusable Object-Oriented Software", Addison-Wesley, 1995

Mary Shaw, "Software Architecture: Perspectives on an Emerging Disciplline", Prentice Hall, 1996

Frank Buschmann, "Pattern Oriented Software Architecture: A System of Patterns", John Wiley & Sons, 1996

Kyle Brown, "Distributed ICM", Distributed Object Computing, October, 1997 available at http://members.aol.com/kgb1001001

46

Page 47: Advanced Swing GUI Programming Kyle Brownpeople.engr.ncsu.edu/efg/517/f00/syllabus/lectures/AdvancedSwing.pdf · Advanced Swing GUI Programming Kyle BrownKyle Brown Executive Java

© Copyright IBM Corporation 1999

References (2)

Bobby Woolf, "Partitioning Smalltalk Code into Envy/Developer Components", Pattern Languages of Program Design 2, Addison-Wesley, 1996

47