在编辑器中创建一个ScrollPane

在实现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;
    }
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值