Top Banner
EFFICIENT SWING DESIGN JGoodies Karsten Lentzsch
132

swing meta design - JGoodies

Feb 11, 2022

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: swing meta design - JGoodies

EFFICIENT SWING DESIGN

JGoodies Karsten Lentzsch

Page 2: swing meta design - JGoodies

JGoodies

Swing libraries

Visual design

Swing consulting

Talks and articles about Swing

Page 3: swing meta design - JGoodies

Goals

Get consistent design quickly and easily

Reduce costs

Get better design

Page 4: swing meta design - JGoodies

Agenda

Introduction

Case studies

TuneQ

IT21

Standard dialogs

Misc

Page 5: swing meta design - JGoodies

How long does it take?

Page 6: swing meta design - JGoodies

Content

Meta design

Non-visual builders

Java layout techniques

Page 7: swing meta design - JGoodies

Context

Page 8: swing meta design - JGoodies
Page 9: swing meta design - JGoodies

Problems

Layouts without planning

Lack of visual architecture

Difficult to find good design

Inconsistencies

High costs

Poor design

Page 10: swing meta design - JGoodies
Page 11: swing meta design - JGoodies

How do designers work?

A meta designer plans all layouts

Each designer chooses a layouts:

per page

per section

per article

Higher planning costs

Lower production costs

Page 12: swing meta design - JGoodies

Examples

Signs

Traffic guidance systems

News paper

Conference material

Architecture

Bus schedule

Page 13: swing meta design - JGoodies
Page 14: swing meta design - JGoodies
Page 15: swing meta design - JGoodies

Elements of Meta Design

Fonts

Colors

Sizes

Order

Gaps

Layout

Contrast

Balance

Page 16: swing meta design - JGoodies
Page 17: swing meta design - JGoodies
Page 18: swing meta design - JGoodies

Meta Design Principle

As fixed as possible, as flexible as needed!

Retains full flexibility

Focuses on content not design

Page 19: swing meta design - JGoodies
Page 20: swing meta design - JGoodies
Page 21: swing meta design - JGoodies
Page 22: swing meta design - JGoodies

Naked Objects / JMatter

Ready solution

Free of charge

Automatically creates a UI

Focuses on domain layer

No hand design

consistent UI

UI consistent with domain layer

Page 23: swing meta design - JGoodies
Page 24: swing meta design - JGoodies
Page 25: swing meta design - JGoodies

Agenda

Introduction

Case studies

TuneQ

IT21

Standard dialogs

Misc

Page 26: swing meta design - JGoodies

TuneQ

Page 27: swing meta design - JGoodies
Page 28: swing meta design - JGoodies
Page 29: swing meta design - JGoodies
Page 30: swing meta design - JGoodies
Page 31: swing meta design - JGoodies
Page 32: swing meta design - JGoodies

Meta Design Specification

Structure: Frame, Views, Editors

Fonts

Colors

Gaps

Orientation

UI elements

Multi-plattform

Page 33: swing meta design - JGoodies

Fonts

Standard font:

for UI controls and display texts

Header font:

for top-level lists and notifications

Category font:

for search result categories

Page 34: swing meta design - JGoodies

Colors

Header

Background

Header font

Action links

Icons

Maps

Page 35: swing meta design - JGoodies

Layout

3 main columns

Text

Text, Text

Text, Text, Image

Text, Image, Image

3 main rows

Instance, Product, List

Instance, List

List

Page 36: swing meta design - JGoodies
Page 37: swing meta design - JGoodies
Page 38: swing meta design - JGoodies
Page 39: swing meta design - JGoodies
Page 40: swing meta design - JGoodies

Columns

new FormLayout(

"pref, 6px, pref, 60px, // Text

pref, 6px, pref, 60px, // Text/Image

pref"); // Image

Page 41: swing meta design - JGoodies

Scalable Layout

new FormLayout(

"pref, 4dlu, pref, 21dlu, // Text

pref, 4dlu, pref, 21dlu, // Text/Image

pref"); // Image

Page 42: swing meta design - JGoodies

Problem

Instable layout, "jumps"

Difficult to perceive similar content

Page 43: swing meta design - JGoodies
Page 44: swing meta design - JGoodies
Page 45: swing meta design - JGoodies
Page 46: swing meta design - JGoodies

Minimum width

new FormLayout(

"[80dlu,pref], 4dlu, pref, 21dlu,

[80dlu,pref], 4dlu, pref, 21dlu,

pref");

Page 47: swing meta design - JGoodies

Layout Variables (Forms 1.2)

new FormLayout(

"[80dlu,pref], $lcgap, pref, 21dlu,

[80dlu,pref], $lcgap, pref, 21dlu,

pref");

Page 48: swing meta design - JGoodies

Layout Variables

new FormLayout(

"$label, $lcgap, pref, $mgap,

$label, $lcgap, pref, $mgap,

pref");

Page 49: swing meta design - JGoodies

Variable Definition

LayoutMap map = LayoutMap.getRoot();

map.columnPut("label", "[80dlu,pref]");

map.columnPut("mgap", "21dlu");

map.rowPut ("lcgap", "3dlu");

map.rowPut ("table", "fill:50dlu:grow");

Page 50: swing meta design - JGoodies

Standard Builder

PanelBuilder builder =

new PanelBuilder(layout);

CellConstraints cc =

new CellConstraints();

builder.addLabel("Label1:", cc.xy(1, 1));

builder.add(content1, cc.xy(3, 1));

builder.addLabel("Label2:", cc.xy(5, 1));

builder.add(content2, cc.xy(7, 1));

Page 51: swing meta design - JGoodies

Special Builder

ViewBuilder builder =

new ViewBuilder(); // Standard layout

builder.add("Label1:", content1, 1, 1);

builder.add("Label2:", content2, 5, 1);

builder.add("Label1:", content1,

"Label2:", content2,

1, 1);

Page 52: swing meta design - JGoodies

Bean Builder

ViewBeanBuilder builder =

new ViewBeanBuilder(aBean);

builder.add("Label1:", "property1", 1, 1);

builder.add("Label2:", "property2", 5, 1);

Page 53: swing meta design - JGoodies

Standard vs. Special Builder

Standard Builder

Seems "dumb"

Blows up sources?

Ready, documented

Maintained, supported

Supported by visual editors

Special Builder

Reduces Code

API design, docs

Maintenance

Training

In 5 years?

Page 54: swing meta design - JGoodies
Page 55: swing meta design - JGoodies

ButtonBarBuilder

ButtonBarBuilder2 builder =

new ButtonBarBuilder2();

builder.addButton(newButton);

builder.addRelatedGap();

builder.addbutton(editButton);

builder.addUnrelatedGap();

builder.addButton(upAction, downAction);

return builder.getPanel();

Page 56: swing meta design - JGoodies

List Types

List only

Buttons

Buttons and search

Buttons, search, filter

Top-level vs. embedded

Page 57: swing meta design - JGoodies
Page 58: swing meta design - JGoodies
Page 59: swing meta design - JGoodies
Page 60: swing meta design - JGoodies
Page 61: swing meta design - JGoodies
Page 62: swing meta design - JGoodies
Page 63: swing meta design - JGoodies

ListBuilder (Components)

ListBuilder builder = new ListBuilder();

builder.setListComponent(elementsTable);

builder.setOperationsBar(newEditDeleteBar);

builder.setUpDownBar(upDownBar);

builder.setRefreshComponent(updateBtn);

builder.setSearchComponent(searchField);

builder.setAdditionalComponents(filterBox);

builder.setEmbedded(false);

Page 64: swing meta design - JGoodies

ListBuilder (Sub Models)

ListBuilder#setList(

ListModel listModel,

ListSelectionModel selectionModel);

#setOperations(

Action newAction,

Action editAction,

Action deleteAction);

#setUpDown(

Action upAction,

Action downAction);

Page 65: swing meta design - JGoodies

ListBuilderModel Interface

ListModel getListModel();

ListSelectionModel getSelectionModel();

void performNew(EventObject e);

String getNewText();

boolean isNewVisible();

void performEdit(EventObject e);

String getEditText();

boolean isEditVisible();

Page 66: swing meta design - JGoodies

Componenten Factory/-Builder

privat void initComponent() {

zipField = Factory.createZIPField();

buildField = Factory.createDateField();

g1Field = Factory.createWeightField();

hightField = Factory.createLengthField();

zipField = Factory.createZipField(model);

ComponentBuilder builder =

new ComponentBuilder(aBean);

zipField = builder.createZipField("zip");

Page 67: swing meta design - JGoodies

Problems

Inconsistent tab order

Inconsistent labels/texts

Inconsistent localization

Page 68: swing meta design - JGoodies

DEMOInfrastructure Maintenance

Page 69: swing meta design - JGoodies
Page 70: swing meta design - JGoodies

Agenda

Introduction

Case studies

TuneQ

IT21

Standard dialogs

Misc

Page 71: swing meta design - JGoodies

Oracle Forms

Page 72: swing meta design - JGoodies

New Design

Page 73: swing meta design - JGoodies

User Perspective

Quicker task completion

Less manual input

Fewer errors

Reduced need for support

Increased data accuracy

More informative

Higher user satisfaction

Improved customer service

Page 74: swing meta design - JGoodies

Developer Perspective

Many forms (> 300)

Programing model easy to understand

Easy to program

No Swing experts available

No expert knowledge required

Page 75: swing meta design - JGoodies

Options

Eclipse RCP vs. custom Swing framework

Finished solution (JMatter) vs. custom design

Page 76: swing meta design - JGoodies
Page 77: swing meta design - JGoodies
Page 78: swing meta design - JGoodies
Page 79: swing meta design - JGoodies
Page 80: swing meta design - JGoodies
Page 81: swing meta design - JGoodies
Page 82: swing meta design - JGoodies
Page 83: swing meta design - JGoodies
Page 84: swing meta design - JGoodies
Page 85: swing meta design - JGoodies
Page 86: swing meta design - JGoodies
Page 87: swing meta design - JGoodies
Page 88: swing meta design - JGoodies

EditorBuilder

#setHeader(JComponent);

#addTab(String, JComponent);

#setContextActions(Action…);

Page 89: swing meta design - JGoodies
Page 90: swing meta design - JGoodies
Page 91: swing meta design - JGoodies
Page 92: swing meta design - JGoodies
Page 93: swing meta design - JGoodies
Page 94: swing meta design - JGoodies
Page 95: swing meta design - JGoodies

HomeViewModel

StringModel getTitleModel();

DetailSearchModel getDetailSearchModel();

QuickSearchModel getQuickSearchModel();

ListModel getListModel();

ListSelectionModel getSelectionModel();

Page 96: swing meta design - JGoodies

HomeViewBuilder

HomeViewBuilder(HomeViewModel)

#setAdditionalComponents(JComponent…);

#setPreview(JComponent);

Page 97: swing meta design - JGoodies

DEMOField Search, Quick Search

Page 98: swing meta design - JGoodies
Page 99: swing meta design - JGoodies
Page 100: swing meta design - JGoodies

Agenda

Introduction

Case studies

TuneQ

IT21

Standard dialog

Misc

Page 101: swing meta design - JGoodies
Page 102: swing meta design - JGoodies
Page 103: swing meta design - JGoodies

Template Pattern

public abstract class AbstractDialog {

abstract JComponent buildHeader();

abstract JComponent buildContent();

abstract JComponent buildButtonBar();

public JComponent buildOKCancelBar() {…};

public JComponent buildCloseBar() {…};

Page 104: swing meta design - JGoodies
Page 105: swing meta design - JGoodies
Page 106: swing meta design - JGoodies
Page 107: swing meta design - JGoodies

Custom Dialog Bean

public class TaskDialog {

void setIcon(Icon icon)

void setMainInstruction(String)

void setContentText(String)

void setCommitButtons(JButton…)

void setVerificationText(String)

void setVerificationSelected(boolean)

void setFootnoteText(String)

Page 108: swing meta design - JGoodies

Dialog Creation

TaskDialog dialog = new TaskDialog();

dialog.setTitle("Confirm Delete");

dialog.setIconType(TaskDialog.WARNING);

dialog.setMainInstruction("Are you sure…");

dialog.setCommitButtons(

TaskDialog.YES,

TaskDialog.NO);

dialog.setDefaultButton(TaskDialog.NO);

dialog.pack();

dialog.setVisible(true);

Page 109: swing meta design - JGoodies

DEMOCreate a Dialog by "Hand"

Page 110: swing meta design - JGoodies

DEMODialog Editor

Page 111: swing meta design - JGoodies

DEMODialog Browser

Page 112: swing meta design - JGoodies

Agenda

Introduction

Case studies

TuneQ

IT21

Standard dialogs

Misc

Page 113: swing meta design - JGoodies
Page 114: swing meta design - JGoodies
Page 115: swing meta design - JGoodies
Page 116: swing meta design - JGoodies
Page 117: swing meta design - JGoodies

Class MetaDesign

public abstract class MetaDesign

#setLayout(LayoutManager layout);

#putConstraints(Object key, Object constr);

#putFont(Object key, Font font);

#putColor(Object key, Color color);

Page 118: swing meta design - JGoodies

MetaDesign Setup 1/2

public class Login extends MetaDesign {

// Keys

static final Object TITLE = "title";

static final Object CONTENT = "content";

static final Object FOOTER_L = "footerL";

static final Object FOOTER_R = "footerR";

Page 119: swing meta design - JGoodies

MetaDesign Setup 2/2

private void init() {

setLayout(new FormLayout("14dlu,…", "…"));

CellConstraints cc = new CellConstraints();

putConstraints(TITLE,

cc.xywh(2, 3, 1, 1, "center","bottom"));

putConstraints(CONTENT,

cc.xywh(3, 5, 1, 1, "center","top"));

Page 120: swing meta design - JGoodies

MetaDesign Panel Building

MetaDesignBuilder builder =

new MetaDesignBuilder(new Login());

builder.add(Login.TITLE, titleLabel);

builder.add(Login.CONTENT, content);

builder.add(Login.FOOTER_L, exitButton);

builder.add(Login.FOOTER_R, changeBar);

builder.add(Login.BACKGRND, backgroundPnl);

builder.getPanel();

Page 121: swing meta design - JGoodies
Page 122: swing meta design - JGoodies
Page 123: swing meta design - JGoodies

What's missing?

How shall I ask this question?

How shall I label the buttons?

When modal? When modeless?

Property or task?

Word list

Design catalog

Style guide

Page 124: swing meta design - JGoodies

Summary

Layout plan

Meta design

Grid / Grid system

Layout

scales with font and resolution

minimum widths

variables

Page 125: swing meta design - JGoodies

Summary

ButtonBarBuilder

ListBuilder

ListBuilderModel

Component factory/-builder

HomePanelBuilder

Custom visual beans

MetaDesignBuilder

Page 126: swing meta design - JGoodies

References I

Microsoft User Experience Guide (UX Guide)

Mac Aqua Human Interface Guidelines (HIG)

"Designing Visual Interfaces" Kevin Mullet & Darrel Sano

"GUI Bloopers" Jeff Johnson

Page 127: swing meta design - JGoodies

References II

"Organizing Presentation Logic" Martin Fowler

"Swing Application Framework" - JSR 296 Hans Muller

Page 128: swing meta design - JGoodies

References III

www.jgoodies.com/articles

First Aid for Swing UIs

Desktop Patterns & Data Binding

Layout and Panel Building

JGoodies Forms

Swing Data Validation

Page 129: swing meta design - JGoodies

References IV

JGoodies FormLayout, Forms Library, www.jgoodies.com/download/

JMatter, Naked Objects for Swing, www.jmatter.org

Page 130: swing meta design - JGoodies

Future

JSR 296 – Swing Application Framework

JSR 295 – Beans Binding

Eclipse RCP

Spring RCP

Visual editors

Java Desktop Blueprints / Style Guide

Page 131: swing meta design - JGoodies

QUESTIONS AND ANSWERS

Page 132: swing meta design - JGoodies

SWING META DESIGN

JGoodies Karsten Lentzsch