如何使用Flash中的ComboBox组件修复此潜在错误?

时间:2010-09-06 15:07:12

标签: flash actionscript-3 uicomponents flash-ide

当我将一个ComboBox组件添加到Sprite中时,容器的高度应该大于它应该的值。

这就是我的意思:

import fl.controls.ComboBox;
//add combo box inside a container sprite
var combo:ComboBox = new ComboBox();
var container:Sprite = new Sprite();
addChild(container);
container.addChild(combo);
//draw the outline of the container sprite
container.graphics.lineStyle(1,0x009900);
container.graphics.drawRect(0,0,container.width,container.height);
//I don't get this:
trace(combo.height);//outputs 22
trace(container.height);//outputs 101

注意:您需要库中的ComboBox组件。我正在使用Flash CS3。

如果我无效/重绘,请执行以下操作:

combo.invalidate(InvalidationType.ALL,true);
combo.drawNow();

高度从101变为104.

任何解决方案?

更新 我已经覆盖了ComboBox子类中的configUI方法,但测量始终是正确的。为什么容器高度变为100?

6 个答案:

答案 0 :(得分:3)

这是因为Adobe愚蠢地植入Flash组件,如果你在Flash IDEA中查看组件的第2帧,你可以看到它是返回初始大小的临时头像。

enter image description here

要解决此问题,您应该迭代头像儿童并规范其大小:

public static function normalizedComponent(component:Sprite):void {
    for (var i:int = 0; i < component.numChildren; i++) {
        component.getChildAt(i).height = component.height;
        component.getChildAt(i).width = component.width;
    }
}

用法:

var comboBox:ComboBox = new ComboBox();
normalizedComponent(comboBox);
normalizedComponent(comboBox.textField);

答案 1 :(得分:1)

“如果它被打开,那么高度与下拉框”

嗯,我认为当列表被添加到按钮下方的displayList时,它实际添加了一个弹出窗口。所以高度应该保持按钮高度,因为精灵永远不会包含下拉列表。

容器高度在经过任何失效之前可能出错的一个可能原因可能是由于它包含的子容量。也许组合框皮肤(可能是102px高度的movieClip)或总是以102px高度或奇怪高度开始的组合框子组件(按钮中的TextField有时会出错)。

一个简单的解决方案是等到creationComplete / added事件并查看最终高度是什么,然后绘制边框。

答案 2 :(得分:1)

我认为这不是ComboBox独家错误。

当我将组件Button添加到Sprite容器时,在跟踪按钮和容器尺寸时,我也会得到不同的结果。实际上,我收到了相同的100 x 100结果。

我会丢弃下拉框的可能性,因为Button组件没有。

我认为2个组件对象(ComboBoxButton)的解决方法是相同的,但我还没有找到解决方案。我会更新。

更新:

我只能使用validateNow()来完成此工作,几分钟后 - 我找到了以下链接:http://forums.adobe.com/message/816912?tstart=0

基本上,该链接指示我们将validateNow()调用放在EnterFrame事件中,或者在SetTimeout内放置适当的时间。

答案 3 :(得分:0)

所以 - 我想 ComboBox 的显示高度是实际高度 - id est,如果它被打开,那么高度带下拉框,如果不是然后没有。但是 - 项目仍在那里,虽然.visible设置为 false ,它仍然扩展容器,即使你看不到...因此 - 我会说:

container.graphics.drawRect(0, 0, combo.width, combo.height);

这也是通常这样做的方式......

答案 4 :(得分:0)

可以在此代码之前手动设置:

container.width=100;

container.height=100;

container.graphics.drawRect(0,0,container.width,container.height);

答案 5 :(得分:0)

您好我找到了解决NumericStepper类似问题的解决方案。

解决方案是:

var tInput:TextInput = numericStepper.getChildAt(2) as TextInput;
tInput.textField.height = 22; 

在您的情况下,请尝试以下操作:

var tInput:TextInput = combo.getChildAt(1) as TextInput;
tInput.textField.height = 22;