370 likes | 585 Views
Building World-Class User Interfaces with Java Foundation Classes. Ted Faison Faison Computing Inc. tedfaison@msn.com. Work is still in progress !. Several areas aren’t yet finalized: Drag and Drop Multiplexing UIFactories 2D API, Shape support, Batch Painting
E N D
Building World-Class User Interfaces with Java Foundation Classes Ted Faison Faison Computing Inc. tedfaison@msn.com W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
The AWT isn’t enough ! W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
JFC Goals • 100% pure Java • Lightweight • Pluggable L&F • Keyboard support • High-level controls • Simple class hierarchy W14 - Building World-Class UIs with JFC - Ted Faison
Comparing hierarchies Menu/Button hierarchies under AWT: Component Button Checkbox Object MenuComponent MenuItem CheckboxMenuItem W14 - Building World-Class UIs with JFC - Ted Faison
Comparing hierarchies • Menu/Button hierarchies under JFC: JComponent AbstractButton JButton JMenuButton JCheckboxMenuItem JMenu JToggleButton JCheckbox JRadioButton W14 - Building World-Class UIs with JFC - Ted Faison
Some JFC high-level controls • JSplitPane, JTabbedPane • JTree • JProgressBar • JSlider • JSpinner • JTextPane • JTable W14 - Building World-Class UIs with JFC - Ted Faison
Other useful JFC controls • JInternalFrame • A lightweight frame • Z order set using ‘layer’ • example • JToolBar • JToolTip • JLayeredPane • allows management of children in “layers” W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
The ComponentUI Interface public 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); } W14 - Building World-Class UIs with JFC - Ted Faison
Pluggable Look & Feel • Provided through a delegation model • components delegate rendering and event handling to their ComponentUI • The ComponentUI derived classes BasicComponentUI, ButtonUI, ComboBoxUI, InternalFrameUI, LabelUI, ListBoxUI, MenuBarUI, MenuItemUI, MenuUI, PopupMenuUI, etc. • You can extend ComponentUI for your own classes W14 - Building World-Class UIs with JFC - Ted Faison
Creating a JFC component • Create a model • Create a componentUI • UIFactory • Set the UI W14 - Building World-Class UIs with JFC - Ted Faison
Creating a JFC component public 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); } } W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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)); W14 - Building World-Class UIs with JFC - Ted Faison
JFC Components delegate painting to their ComponentUI public class JComponent { // … public void paint(Graphics g) { if (ui != null) ui.paint(g, this); super.paint(g); // paint children if any } } W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
Accelerator Key Management • The When Condition: • WHEN_FOCUSED • WHEN_FOCUSED_COMPONENT_PARENT • WHEN_IN_FOCUSED_WINDOW • ALWAYS W14 - Building World-Class UIs with JFC - Ted Faison
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) {…} } W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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) W14 - Building World-Class UIs with JFC - Ted Faison
The Document Interface • A quick look at the decompiled code • The interface doesn’t enforce a policy of character management or storage W14 - Building World-Class UIs with JFC - Ted Faison
Document events and listeners • Listeners are document viewers • Events indicate changes to the underlying text. W14 - Building World-Class UIs with JFC - Ted Faison
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); } W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
Advanced Text Features • Integration with Java 2D API • Transparency • Rotation, Scaling, Sheering • Characters along paths • using characters as clipping paths • custom character fill-in W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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(); } W14 - Building World-Class UIs with JFC - Ted Faison
Installing a custom manager • Call the JComponent method: setManagerForComponent(DirtyRegionManager m, Component c) {…} • Getting the current manager: getManagerForComponent(Component c) {…} W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison
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 W14 - Building World-Class UIs with JFC - Ted Faison