有人知道多列VBox的例子吗?

时间:2010-02-01 16:39:00

标签: flex actionscript-3 vbox

只是想知道是否有人知道那里的例子,或者我可以添加到我的应用程序中的类似VBox但有2列或更多列的类?

我正在从循环中向VBox添加项目,这样可以正常工作,但我希望将它分成两列:

 _________________
|        |        |
| Item 1 | Item 2 |
| Item 3 | Item 4 |
| Item 5 |        |
|________|________|

现在我只是并排设置2个VBox并将奇数项分配给一个,甚至分配给另一个,但让控件自动执行此操作会很好。

修改
请停止让我解决问题。我已经完成了功能性工作。但是如果你已经写了一个这样做的课程,或者知道我在哪里可以找到一个,我会非常感激。 感谢

7 个答案:

答案 0 :(得分:1)

flexlib(http://code.google.com/p/flexlib/)有一个可爱的FlowContainer容器控件,可以完全满足您的需求。

答案 1 :(得分:0)

把它们放在HBox中?

答案 2 :(得分:0)

你可以为每一行使用一个包含HBox的VBox,只需在每个HBox上填充两个项目,例如:

var vb:VBox;
var array_of_items:Array;

for(var i:int = 0; i< array_of_items.length; i + = 2)
{
  var hb:Hbox = new HBox();
  hb.addChild(array_of_items [I]);
  hb.addChild(array_of_items第[i + 1]);
  vb.addChild(HB);
}

答案 3 :(得分:0)

我用HBox和2种形式做了类似的事情,这很好地排列了一些东西。 动态地,您可以替换为每个表单添加子项。

答案 4 :(得分:0)

为什么不直接使用Tile Container,并将direction属性设置为所需的流向?

答案 5 :(得分:0)

我自己也遇到过类似的问题。这就是我最终使用的:

package {
    import mx.containers.HBox;
    import mx.containers.VBox;
    import mx.events.FlexEvent;

    public class MultiColumnVBox extends HBox {
        // public properties
        public var columnWidth:int;
        public var verticalGap:int;
        public var adjustForScrollbar:Boolean;

        public function MultiColumnVBox() {
            super();
            this.addEventListener(FlexEvent.CREATION_COMPLETE, rearrangeChildren);
        }

        private function rearrangeChildren(evtObj:FlexEvent):void {
            // height will change whilst rearranging children, as will the Children Array
            // we store them once at the start
            var myHeight:int = this.height;
            var children:Array = this.getChildren();

            var lastIndex:int = 0;
            var vBoxIndex:int = 0;
            var vBox:VBox;
            var totalHeight:int = -this.verticalGap + (this.adjustForScrollbar ? 16 : 0);

            for(var i:int=0; i<children.length; i++) {
                // resize each child and measure the height
                // if you don't want it resized to the columnWidth, set the maxWidth property
                children[i].width = this.columnWidth;
                children[i].validateSize();
                totalHeight += children[i].measuredHeight + this.verticalGap;
                // if we're too tall, or we've reached the last element, move them into a VBox
                if(totalHeight > myHeight || i == children.length-1) {
                    vBox = new VBox();
                    vBox.setStyle("verticalGap", this.verticalGap);
                    vBox.width = this.columnWidth;
                    // include last child if there is room
                    for(var j:int=lastIndex; j<(totalHeight > myHeight ? i : i+1); j++) {
                        vBox.addChild(children[j]);
                    }
                    this.addChildAt(vBox, vBoxIndex);
                    vBoxIndex += 1;
                    lastIndex = i;
                    totalHeight = -this.verticalGap + (this.adjustForScrollbar ? 16 : 0);
                }
            }
        }
    }
}

然而,最终结果略有不同。它不是将子项移动到交替列,而是无限期地填充第一列的高度,然后填充第二列,然后是第三列等。

如果您打算制作我们的课程,正如您所说,类似的方法应该有效:等待CREATION_COMPLETE事件,然后将子项重新排列为两个VBox控件。

答案 6 :(得分:0)

我认为方向=“水平”的Tile容器会这样做