+ All Categories
Home > Documents > W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java...

W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java...

Date post: 11-Jan-2016
Category:
Upload: lisa-pitts
View: 216 times
Download: 0 times
Share this document with a friend
37
W14 - Building World-Class UIs with JFC - Ted Faison 1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc. [email protected]
Transcript
Page 1: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

1

Building World-Class User Interfaces with Java Foundation Classes

Ted FaisonFaison Computing [email protected]

Page 2: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

2

Work is still in progress !

Several areas aren’t yet finalized:• Drag and Drop• Multiplexing UIFactories• 2D API, Shape support, Batch Painting• Focus navigation and keyboard

support• Several high-level controls• The text support framework

Page 3: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

3

The AWT isn’t enough !

Page 4: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

4

AWT Limitations

• Few controls• Uses heavyweight objects (peers)• Platform-dependent Look and Feel

– no support for pluggable L&Fs

• no support for 2D or 3D operations– Bezier Curves, Shapes, Transparency– Rotation, Shading, Clipping

Page 5: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

5

JFC Goals

• 100% pure Java• Lightweight• Pluggable L&F• Keyboard support• High-level controls• Simple class hierarchy

Page 6: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

6

Comparing hierarchies

Menu/Button hierarchies under AWT:

Component

Button

Checkbox

Object

MenuComponent

MenuItem

CheckboxMenuItem

Page 7: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

7

Comparing hierarchies

• Menu/Button hierarchies under JFC:JComponent

AbstractButton

JButton

JMenuButton

JCheckboxMenuItem

JMenu

JToggleButton

JCheckbox

JRadioButton

Page 8: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

8

Some JFC high-level controls• JSplitPane, JTabbedPane• JTree• JProgressBar• JSlider• JSpinner• JTextPane• JTable

Page 9: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

9

Other useful JFC controls

• JInternalFrame– A lightweight frame– Z order set using ‘layer’– example

• JToolBar• JToolTip• JLayeredPane

– allows management of children in “layers”

Page 10: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

10

The MVC Architecture

• Model holds view-independent data• View observes model

– provides screen & printer output

• Controller interacts with user– user interacts with controller through views

• in JFC, controller and view are integrated– ComponentUI, used by all JComponents

Page 11: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

11

The ComponentUI Interfacepublic interface ComponentUI

{

void installUI(JComponent c);

void deinstallUI(JComponent c);

void paint(Graphics g, JComponent c);

Dimension getPreferredSize(JComponent c);

Dimension getMinimumSize(JComponent c);

Dimension getMaximumSize(JComponent c);

Insets getInsets(JComponent c);

}

Page 12: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

12

Pluggable Look & Feel

• Provided through a delegation model– components delegate rendering and

event handling to their ComponentUI

• The ComponentUI derived classesBasicComponentUI, ButtonUI, ComboBoxUI, InternalFrameUI, LabelUI, ListBoxUI, MenuBarUI,

MenuItemUI, MenuUI, PopupMenuUI, etc.

• You can extend ComponentUI for your own classes

Page 13: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

13

Creating a JFC component

• Create a model• Create a componentUI

– UIFactory

• Set the UI

Page 14: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

14

Creating a JFC componentpublic class JTree extends JComponent {

protected TreeModel treeModel = new TreeModel();

public JTree () {

setModel(treeModel);

String fallbackUI =

"com.sun.java.swing.BasicTreeUI";

BasicTreeUI treeUI =

(BasicTreeUI) UIManager.getUI("BasicTreeUI",

fallbackUI,

this);

setUI(treeUI);

}

}

Page 15: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

15

Pluggable L&F

• JFC comes with a built-in Win95 L&F– The Basic… ComponentUIs

• Win95 is the normal fallback L&F• You can create your own custom,

or corporate L&F

Page 16: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

16

Changing L&F

• At compile time– using a different ComponentUI

• At runtime– using a different UIFactory

UIManager.setUIFactory(UIFactory f,

Container c);

– Passing a container will reset all its children

Page 17: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

17

Multiplexing UIFactories

• Allow one factory to control the L&F of an entire group of components

• API not fully finalized yet• Use:

setUI((BasicTreeUI) UIManager.getUI(

"BasicTreeUI",

"com.sun.java.swing.basic.BasicTreeUI",

this));

Page 18: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

18

JFC Components delegate painting to their ComponentUIpublic class JComponent {

// …

public void paint(Graphics g) {

if (ui != null)

ui.paint(g, this);

super.paint(g); // paint children if any

}

}

Page 19: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

19

JFC MFC Model objects

• They implement a model interface

interface TreeModel {…}

class JTreeModel implements TreeModel {…}

• They support a listener, which is typically a JComponent, e.g. JTree.– Changes are broadcast to the listener– The listener syncs the UI with the

model

Page 20: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

20

Keyboard Focus Management• Navigating inside groups and

between groups– Arrow and tab keys

• Focus navigation keys are hardwired in native GUIs and AWT

• Navigator can be customized in JFC• Implementation not released yet

• Default focus navigator moves focus in locale’s natural reading order

Page 21: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

21

Accelerator Key Management• Not finalized yet• The Keyboard Action registry

registerKeyboardAction(JAction a, JKeyStroke k,

int when);

• JAction: objects that can receive an actionPerformed(ActionEvent) call.

• JKeyStroke encapsulates charCode and modifier

Page 22: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

22

Accelerator Key Management• The When Condition:

• WHEN_FOCUSED•WHEN_FOCUSED_COMPONENT_PARENT

• WHEN_IN_FOCUSED_WINDOW• ALWAYS

Page 23: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

23

An example

class MyComponent extends JComponent {

MyComponent() {

myComponent.registerKeyboardAction(

new AltKHandler(),

JKeyStroke.getKeyStroke('K',

InputEvent.ALT_MASK),

WHEN_IN_FOCUSED_WINDOW);

}

class AltKHandler extends JAction {

public void actionPerformed(ActionEvent e) {…}

}

Page 24: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

24

Accelerator key management• Default key dispatching policy:

– The focused component– The focused component parent’s tree– Components with same parent as

focused component– Components with condition =

ALWAYS

Page 25: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

25

Advanced text handling

• Support for rich text, e.g. multiple fonts, sizes, colors, etc.

• JTextComponent– designed to handle SGML-type

capabilities

• TextUI – the viewer– An abstract class

Page 26: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

26

The Document interface

• Structures text as arrays of elements• Each element is a stream of

characters• The location of characters

– class Position (not finalized)

• Selecting text– class Range

• encodes pairs of Positions (not finalized)

Page 27: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

27

The Document Interface

• A quick look at the decompiled code

• The interface doesn’t enforce a policy of character management or storage

Page 28: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

28

Document events and listeners• Listeners are document viewers• Events indicate changes to the

underlying text.

Page 29: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

29

Interface DocumentEvent

public interface DocumentEvent {

Range getRange();

Document getDocument();

UndoableEdit getEdit();

boolean isModified(Element p0);

Element[] elementsModified();

Element[] childrenRemoved(Element p0);

Element[] childrenAdded(Element p0);

}

Page 30: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

30

Advanced Text Features• Highlighting

– coloring the background of text

• Generic attributes– custom text attributes, with (key, value)

pairs

• Flow control– Elements can be assigned to “boxes” that

constrain their exact position and flow.

• Embedded pictures– class JIconView

Page 31: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

31

Advanced Text Features

• Integration with Java 2D API– Transparency– Rotation, Scaling, Sheering– Characters along paths– using characters as clipping paths

• custom character fill-in

Page 32: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

32

Other JFC enhancements

• Standardized Component Borders– All JComponents use JBorders

• lines, grooves, titled, raised, recessed borders

• Support for an Undo/Redo framework• Popup menus• Tables• Drag and Drop

Page 33: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

33

Other JFC enhancements

• Optimized drawing (not finalized yet)– Reduces multiple screen updates to a

single operation– Based on the new class DirtyRegionManger– Manager stores a list of the out-of-date

regions– Regions can have arbitrary shape, which

are objects implementing the Shape interface

Page 34: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

34

The DirtyRegionManager

interface DirtyRegionManager {

public void addDirtyRegion(Component c,

Shape dirtyRegion);

public void addDirtyRegion(Component c, int x,

int y, nt w, int h);

public void paintDirtyRegions();

public void markCompletelyDirty();

public void markCompletelyClean();

}

Page 35: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

35

Installing a custom manager• Call the JComponent method:

setManagerForComponent(DirtyRegionManager m,

Component c) {…}

• Getting the current manager:

getManagerForComponent(Component c) {…}

Page 36: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

36

Drag and Drop• Not finalized yet• Diverges from earlier JDK 1.1 model,

due to JFC MVC addition• Platform independent

– works across Java and native applications

• Uses a DragSource and a DropTarget• Data can be moved or copied• MIME DataFlavors

Page 37: W14 - Building World-Class UIs with JFC - Ted Faison1 Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc.

W14 - Building World-Class UIs with JFC - Ted Faison

37

Conclusion

• The JFC is a big deal• JDK 1.2 will contain the JFC• JFC positions Java for high-end

applications• JFC leverages existing JDK work• Migration of existing code to JFC is not too

hard• JFC is designed to use services provided

by the upcoming Java 2D API


Recommended