资源描述
Jgoodies –forms 白皮书
1、 介绍
JGoodies 的forms 框架可以帮助你快速、轻松布局和实现简明的Swing panel 控件,
Forms 框架是一个易用的布局框架。
这个文档将会介绍JGoodies forms 的框架和解析现有存在的布局系统,现有的设计目的是,怎么去套用Forms 的模型和API和对比forms 和其他布局系统的区别。
Forms 的焦点在于以导向的形式,在例子中更像是panel控件的一部分。至少,在大多数情况下,他是个长方形布局。
上图使用了forms 的布局
内容
介绍
Form的布局
Form的创建
Form的工厂
Form 和其他的布局框架对比
其他模式
现存在的布局系统的缺点
我发现很对开发员面临现有布局系统带来的相同问题:这些布局系统很难去了解和使用,他们不能体现出人们思想的布局模型,这些工具没有区分关系,例如:一个布局管理器怎么去指定布局和填充容器。
源代码通常很难去阅读,你很难从代码里面了解布局是怎么样的,一些布局管理器是很难用的,例如,如果你想改变外观或者方案,只提供一些像素大小并没有提供一些属性来使用。
一些布局系统是可以扩展的,但是却没有提供公共的布局,直到一些开发员挖掘一些细节才发现不能使用。
设计目标
我们希望能尽快的构建布局,这个框架能覆盖90% 的桌面应用,可以包含负责的panel ,aplications和teams,可以帮助使用者更快的构建和节省时间。
From框架的源代码都是很容易读和容易理解,这个布局框架可以很好的构建一些可视化的组件。它也不需要去学习和扩展它的代码。
如何使用forms 框架
Forms 框架有五个需要依照的原则:
1、 使用网格作为一个简单的布局,跟多的布局使用网格系统;
2、 区分关注点;
3、 提供强有力的布局执行语音;
4、 通过字符来简化代码;
5、 在布局管理器上提供开发向导。
1)网格系统是一个去布局元素强有力、灵活、简单的方法,专业的设计者每天工作都使用网格去寻找、衡量、和服用好的设计,看1、7、8、11页,你会发现很多用户接口程序员使用网格去布局或者描绘组件,这些工作是协调好纸和笔还有至少的可视化工具。
2)布局管理进程在一个类中包含一些特性,指定一个布局,填充一个控件的panel 和设置一个控件的范围,在另外一个方面,很多布局系统欠缺支持频繁的使用布局和不提供可在利用的公共设计,如果我们没有关心,使用在各种场景的类和自由的结合使用等这些问题会被忽略,forms 框架用一类去描述form中的网格,不可见的去填充form,使用布局管理器仅仅为了一个工作,计算和设置components的规格。
3)在你填充你的panel之前和布局管理器设置你的组件规范之前你描述你的窗体布局,你可以在解析语音中指定你的网格布局所以阅读你的代码的人可以快速的从你的代码总获取信息,修改也很容易。一个简单的指定可以应用在许多组件中,例如,你可以指定你所有的label 在列的右边。
4)为了将来提高代码的可读性,在人们阅读中我们允许在代码中详细说明网格布局,简明的语音使用字符类型来执行。这种方法甚至可以用少量的代码来解析复杂的布局。
5)forms 框架在布局管理器中提供抽象类去统一ui和风格,不是可视化的类建设驱动着form的布局,他们帮助你了解网格。例如 ,ButtonBarBuilder类他创建按钮条和默认空白,DefaultFormBuilt 创建带label列的panel和组件 ,且段落间隔相等。
工厂类利用builder 预制panel,ButtonBuildFactory 创建默认的按钮条。
我们需要提到三个代码层:
1、 布局类:布局管理、大小、线条和约束;
2、 不可视的builder类去填充panel;
3、 工厂类声明预制的布局和panel;
我们所提供的代码;
1、 一个demo应用;
2、 一份资料;
3、 一个很好的设计例子
Form 布局
FormLoyout,是一个强大且灵活且严谨的布局管理器,组件的水平和垂直对齐都在一个强大的布局长方形框里面,每一个组件都出现在一个或者多个格子里面。明确一个form的布局,你需要明确他的列、行和选择列的组和行的组。每一个布局也仅仅是在行和列的组合中完成。FormLoyout 使用相同的API,算法和执行都在列和行中。
例子:基于formLoyout 的特性我们跳到例子中去。我们将会一步步的学习详细的部分和学会怎么用最少的代码写出复杂的布局。
例子1(这个例子在组件加入form前创建了一个panel,它带有3个数据列和3个数据行)
FormLayout layout = new FormLayout(
"left:pref, 6dlu, 50dlu, 4dlu, default", // columns
"pref, 3dlu, pref, 3dlu, pref"); // rows
CellConstraints cc = new CellConstraints();
JPanel panel = new JPanel(layout);
panel.add(new JLabel("Label1"), cc.xy (1, 1));
panel.add(new JTextField(), cc.xywh(3, 1, 3, 1));
panel.add(new JLabel("Label2"), cc.xy (1, 3));
panel.add(new JTextField(), cc.xy (3, 3));
panel.add(new JLabel("Label3"), cc.xy (1, 5));
panel.add(new JTextField(), cc.xy (3, 5));
panel.add(new JButton("/u2026"), cc.xy (5, 5));
效果图
例子2(使用panelBuilder 类,这个例子创建了一个在组件加入form之前使用PanelBuilder去创建一个panel)
FormLayout layout = new FormLayout(
"right:pref, 6dlu, 50dlu, 4dlu, default", // columns
"pref, 3dlu, pref, 3dlu, pref"); // rows
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();
builder.addLabel("Label1", cc.xy (1, 1));
builder.add(new JTextField(), cc.xywh(3, 1, 3, 1));
builder.addLabel("Label2", cc.xy (1, 3));
builder.add(new JTextField(), cc.xy (3, 3));
builder.addLabel("Label3", cc.xy (1, 5));
builder.add(new JTextField(), cc.xy (3, 5));
builder.add(new JButton("/u2026"), cc.xy (5, 5));
JFrame jf=new JFrame();
jf.add(builder.getPanel());
jf.pack();
jf.setVisible(true);
效果图
例子
FormLayout layout = new FormLayout(
"right:pref, 3dlu, default:grow",
"");
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
builder.setRowGroupingEnabled(true);
CellConstraints cc = new CellConstraints();
// In this approach, we add a gap and a custom row.
// The advantage of this approach is, that we can express
// the row spec and comment area cell constraints freely.
// The disadvantage is the misalignment of the leading label.
// Also the row's height may be inconsistent with other rows.
builder.appendSeparator("Single Custom Row");
builder.append("Name", new JTextField());
builder.appendRow(builder.getLineGapSpec());
builder.appendRow(new RowSpec("top:31dlu")); // Assumes line is 14, gap is 3
builder.nextLine(2);
builder.append("Comment");
builder.add(new JScrollPane(new JTextField()),
cc.xy(builder.getColumn(), builder.getRow(), "fill, fill"));
builder.nextLine();
// In this approach, we append a standard row with gap before it.
// The advantage is, that the leading label is aligned well.
// The disadvantage is that the comment area now spans
// multiple cells and is slightly less flexible.
// Also the row's height may be inconsistent with other rows.
builder.appendSeparator("Standard + Custom Row");
builder.append("Name", new JTextField());
builder.append("Comment");
builder.appendRow(new RowSpec("17dlu")); // Assumes line is 14, gap is 3
builder.add(new JScrollPane(new JTextField()),
cc.xywh(builder.getColumn(), builder.getRow(), 1, 2));
builder.nextLine(2);
// In this approach, we append two standard rows with associated gaps.
// The advantage is, that the leading label is aligned well,
// and the height is consistent with other rows.
// The disadvantage is that the comment area now spans
// multiple cells and is slightly less flexible.
builder.appendSeparator("Two Standard Rows");
builder.append("Name", new JTextField());
builder.append("Comment");
builder.nextLine();
builder.append("");
builder.nextRow(-2);
builder.add(new JScrollPane(new JTextArea()),
cc.xywh(builder.getColumn(), builder.getRow(), 1, 3));
JFrame jf=new JFrame();
jf.add(builder.getPanel());
jf.pack();
jf.setVisible(true);
ButtonBarBuilder2 builder = new ButtonBarBuilder2();
builder.addGlue();
builder.addButton(new JButton("01"));
builder.addRelatedGap();
builder.addButton(new JButton("02"));
builder.addRelatedGap();
builder.addButton(new JButton("03"));
图片
展开阅读全文