在实现UI编辑器的时候,由于本身有些UI组件是一个窗体类型的组件。那么我们在编辑器中画的时候也需要画窗体,侧滑条之类的都得备齐了。
gef窗体的构造元素:
1.ScrollPane:一个架子,有两个滑调,负责显示窗体的最外层边框,如侧滑条。
2.Viewport:视口,本来把有很多内容,但是视口里面就只能看到一部分,其它部分的内容被隐藏。
3.IFigure:视口里面的内容,它是真实的,大而全的。Viewport永远只显示它的一部分,而通过滑调来改变位置。
gef提供的大纲视图的鹰眼功能就是通过这套机制实现的。
ScrollPane:在draw2d中ScrollPane是用于实现由侧滑条的窗体,它本身不是很复杂。有两个ScrollBar是纵横两个滑条,在构建的时候,可以设置滑调的显示状态,是永不出现,永远出现,还是自动出现三种状态。
ScrollPane:
1.可以单独设置横向或纵向的滑调的显示状态
2.可以设置scrollTo:就是我们鼠标拉动滑块的位置,也可以直接设定值
3.可以setContents:这个是设置内容,其实就是上述的3,窗体里面的所有内容。
4.可以设置Viewport:就是上述2
5.作为一个figure,scrollpane的布局是ScrollPaneLayout,ScrollPaneLayout里面侧重于计算滑条的位置,而不关注容器内部的内容。
6.ScrollPaneSolver:这个类是用来计算ScrollPane里面显示的内容的。
1)Result:ScrollPaneSolver里面的一个静态常量,保存窗体显示的信息。是否显示滑调H和V,viewportArea,insets。
7.RangeModel:在创建ScrollBar的时候,会构造一个RangeModel对象,这个对象保存的是ScrollBar的一些信息。Maximum,Minimum,Value,Extent。Value:是滑块的位置。Extent:程度,没搞清楚啥意思。
在ScrollPane中RangeModel来自Viewport。
Viewport:Viewport实现了一个PropertyChangeListener监听
1.提供了两个默认的RangeModel,并提供给ScrollPane
2.ViewportLayout:此layout主要计算窗体显示内容的区域
3.实现了PropertyChangeListener,当RangeModel的值改变的时候,会刷新内容:
public void propertyChange(PropertyChangeEvent event) {
if (event.getSource() instanceof RangeModel) {
if (RangeModel.PROPERTY_VALUE.equals(event.getPropertyName())) {
if (!ignoreScroll) {
localRevalidate();
if (useGraphicsTranslate()) {
repaint();
fireMoved();
}
}
firePropertyChange(PROPERTY_VIEW_LOCATION, event.getOldValue(),
event.getNewValue());
}
}
}
总结:
1.根据上述,可以知道,创建一个ScrollPane的时候,必须为其传人一个Viewport对象,因为ScrollPane的滑调的RangeModel是由Viewport提供的。
2.要用setContents方法为ScrollPane设置内容,而不是add,ScrollPane是要把内容传入Viewport的,当然也可以把内容设置给Viewport。
3.ScrollPane是一个容器,它里面有一个Viewport容器,Viewport里面装的才是我们实际的内容。
例子:
public static IFigure createPane(){
ScrollPane scrollpane = new ScrollPane();
scrollpane.setLocation(new Point(10, 10));
scrollpane.setSize(new Dimension(100, 100));
//设置纵向的滑条不显示
scrollpane.setVerticalScrollBarVisibility(ScrollPane.NEVER);
scrollpane.setViewport(new Viewport());
Panel figure = new Panel();
// figure.setBorder(new LineBorder(5));
figure.setOpaque(false);
//当内容的Size大于ScrollPane的size就会出现滑条
figure.setSize(new Dimension(210, 100));
figure.setBackgroundColor(ColorConstants.red);
scrollpane.setContents(figure);
return scrollpane;
}