Jgoodies布局框架.docx
《Jgoodies布局框架.docx》由会员分享,可在线阅读,更多相关《Jgoodies布局框架.docx(8页珍藏版)》请在冰豆网上搜索。
Jgoodies布局框架
Jgoodies布局框架
D
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个数据行)
FormLayoutlayout=newFormLayout(
"left:
pref,6dlu,50dlu,4dlu,default",//columns
"pref,3dlu,pref,3dlu,pref");//rows
CellConstraintscc=newCellConstraints();
JPanelpanel=newJPanel(layout);
panel.add(newJLabel("Label1"),cc.xy(1,1));
panel.add(newJTextField(),cc.xywh(3,1,3,1));
panel.add(newJLabel("Label2"),cc.xy(1,3));
panel.add(newJTextField(),cc.xy(3,3));
panel.add(newJLabel("Label3"),cc.xy(1,5));
panel.add(newJTextField(),cc.xy(3,5));
panel.add(newJButton("/u2026"),cc.xy(5,5));
效果图
例子2(使用panelBuilder类,这个例子创建了一个在组件加入form之前使用PanelBuilder去创建一个panel)
FormLayoutlayout=newFormLayout(
"right:
pref,6dlu,50dlu,4dlu,default",//columns
"pref,3dlu,pref,3dlu,pref");//rows
PanelBuilderbuilder=newPanelBuilder(layout);
CellConstraintscc=newCellConstraints();
builder.addLabel("Label1",cc.xy(1,1));
builder.add(newJTextField(),cc.xywh(3,1,3,1));
builder.addLabel("Label2",cc.xy(1,3));
builder.add(newJTextField(),cc.xy(3,3));
builder.addLabel("Label3",cc.xy(1,5));
builder.add(newJTextField(),cc.xy(3,5));
builder.add(newJButton("/u2026"),cc.xy(5,5));
JFramejf=newJFrame();
jf.add(builder.getPanel());
jf.pack();
jf.setVisible(true);
效果图
例子
FormLayoutlayout=newFormLayout(
"right:
pref,3dlu,default:
grow",
"");
DefaultFormBuilderbuilder=newDefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
builder.setRowGroupingEnabled(true);
CellConstraintscc=newCellConstraints();
//Inthisapproach,weaddagapandacustomrow.
//Theadvantageofthisapproachis,thatwecanexpress
//therowspecandcommentareacellconstraintsfreely.
//Thedisadvantageisthemisalignmentoftheleadinglabel.
//Alsotherow'sheightmaybeinconsistentwithotherrows.
builder.appendSeparator("SingleCustomRow");
builder.append("Name",newJTextField());
builder.appendRow(builder.getLineGapSpec());
builder.appendRow(newRowSpec("top:
31dlu"));//Assumeslineis14,gapis3
builder.nextLine
(2);
builder.append("Comment");
builder.add(newJScrollPane(newJTextField()),
cc.xy(builder.getColumn(),builder.getRow(),"fill,fill"));
builder.nextLine();
//Inthisapproach,weappendastandardrowwithgapbeforeit.
//Theadvantageis,thattheleadinglabelisalignedwell.
//Thedisadvantageisthatthecommentareanowspans
//multiplecellsandisslightlylessflexible.
//Alsotherow'sheightmaybeinconsistentwithotherrows.
builder.appendSeparator("Standard+CustomRow");
builder.append("Name",newJTextField());
builder.append("Comment");
builder.appendRow(newRowSpec("17dlu"));//Assumeslineis14,gapis3
builder.add(newJScrollPane(newJTextField()),
cc.xywh(builder.getColumn(),builder.getRow(),1,2));
builder.nextLine
(2);
//Inthisapproach,weappendtwostandardrowswithassociatedgaps.
//Theadvantageis,thattheleadinglabelisalignedwell,
//andtheheightisconsistentwithotherrows.
//Thedisadvantageisthatthecommentareanowspans
//multiplecellsandisslightlylessflexible.
builder.appendSeparator("TwoStandardRows");
builder.append("Name",newJTextField());
builder.append("Comment");
builder.nextLine();
builder.append("");
builder.nextRow(-2);
builder.add(newJScrollPane(newJTextArea()),
cc.xywh(builder.getColumn(),builder.getRow(),1,3));
JFramejf=newJFrame();
jf.add(builder.getPanel());
jf.pack();
jf.setVisible(true);
ButtonBarBuilder2builder=newButtonBarBuilder2();
builder.addGlue();
builder.addButton(newJButton("01"));
builder.addRelatedGap();
builder.addButton(newJButton("02"));
builder.addRelatedGap();
builder.addButton(newJButton("03"));
图片