[flex] 初学自造控件,"继承"和"组装"的抉择及困惑
TonyLian
2008-12-04
我想自造一个控件,他是继承自谋一控件,又在其中加上另一控件。
具体说,就是一个DataGrid下面加一些Button,做成一个支持翻页的Grid(前一页、下一页 等) 我希望这个新控件MyDataGrid是继承自DataGrid的,而不希望是在一个VBox里上面放一个DataGrid,下面放一排按钮。 现在的问题是,采用继承的方法,该如何让DataGrid给下面的一排按钮腾出一些空间呢? 我现在只能让按钮“飘”在DataGrid上,或伸出去,压在MyDataGrid下面的其他控件上面(DataGrid的下边缘直接接着其他控件) 不希望是在一个VBox里上面放一个DataGrid,下面放一排按钮的原因: 我希望MyDataGrid能直接点取出DataGrid的原有属性和方法。 myDataGrid.dataProvider = XXX; 而不是 myDataGrid.dataGrid.dataProvider = XXX; 这正是“继承”和“组合”的意义所在。 举个例子:汽车是由一些零部件组装而成的,它不是继承自某一零部件,即使最重要的发动机。他是组装。 所以当我们发动汽车时,“发动汽车”其实只是我们人的一种偷懒或是习惯性的说法,严格来说应该是“发动汽车的发动机”,即 汽车.发动机.发动(); 我们将一辆普通汽车改装成赛车时(加个绕流板),情况就变了,这次是继承了。赛车也是汽车(白马也是马)。 赛车的车身颜色(假定为单色的)是继承自汽车的属性,我们可以通过 赛车.颜色 来得知,显然不是 赛车.汽车.颜色 这就是我想要 myDataGrid.dataProvider = XXX; 而不是 myDataGrid.dataGrid.dataProvider = XXX; 的形象比喻。 再形象地比喻一下我遇到的问题,就是:我这个绕流板没法挂接到车屁股上(无法出车身三维的尺寸) 要么缩到后备箱里,要么出去飞到了后面一辆车的引擎盖上!! 欢迎有自造控件经验的TX一起讨论 |
|
frogfool
2008-12-08
1 inheritance
2 public class MyDataGrid extends DataGrid { private var pagination:Pagination; override protected function createChildren():void { if (!pagination){ // We're using our custom ViewTabBar class instead of TabBar pagination = new Pagination(); pagination.addEventListener(...); rawChildren.addChild(pagination); } } override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); var bm:EdgeMetrics = borderMetrics; pagination.move(bm.left,unscaledHeight- pagination.height); } override public function get viewMetrics():EdgeMetrics { var vm:EdgeMetrics = super.viewMetrics; vm.bottom += pagination.getExplicitOrMeasuredHeight(); return vm; } } |
|
frogfool
2008-12-08
use
rawChildren.addChild(pagination); instead of this.addChild(pagination); |