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

如何使用Flash中的ComboBox组件修复此潜在错误?,flash,actionscript-3,uicomponents,flash-ide,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 o

当我将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?

所以-我猜组合框的显示高度是实际高度-id est,如果打开,则为带下拉框的高度,如果没有,则为不带下拉框的高度。但是-项目仍然存在,尽管将.visible设置为false,这仍然会扩展容器,即使您看不到。。。因此,我想说:

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

这也是通常的做法…

因此-我猜组合框的显示高度是实际高度-id est,如果打开,则是带有下拉框的高度,如果没有,则没有。但是-项目仍然存在,尽管将.visible设置为false,这仍然会扩展容器,即使您看不到。。。因此,我想说:

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

这也是通常执行此操作的方法…

在执行此代码之前,是否可以手动设置:

container.width=100

容器高度=100


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

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

container.width=100

容器高度=100

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

“如果已打开,则使用下拉框显示高度”

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

在容器失效之前,容器高度可能错误的一个可能原因是它包含的子容器。可能是组合框外观(可能是高度为102px的movieClip)或总是以102px高度或奇怪高度开始的组合框子组件(按钮中的文本字段有时会出错)

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

“如果打开边框,则使用下拉框显示高度。”

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

在容器失效之前,容器高度可能错误的一个可能原因是它包含的子容器。可能是组合框外观(可能是高度为102px的movieClip)或总是以102px高度或奇怪高度开始的组合框子组件(按钮中的文本字段有时会出错)


一个简单的解决方案是等待creationComplete/added事件完成,然后查看最终高度,然后绘制边界。

嗨,我在某个地方找到了一个解决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; 

嗨,我在某个地方找到了一个解决类似问题的方法

解决办法是:

var tInput:TextInput = numericStepper.getChildAt(2) as TextInput;
tInput.textField.height = 22; 
在您的情况下,请尝试以下操作:

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

我不认为这是一个
组合框
独有的bug

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

我将放弃下拉框的可能性,因为
按钮
组件没有下拉框

我认为对于两个组件对象(
ComboBox
Button
)的解决方法是相同的,但我还没有找到解决方案。会在我更新时更新

更新:

我刚刚能够使用
validateNow()
实现这一点,几分钟后,我找到了以下链接:


本质上,该链接指示我们将
validateNow()
调用放在
EnterFrame
事件中,或者放在
SetTimeout
中,并进行适当的计时。

我不认为这是一个
组合框
独占性错误

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

我将放弃下拉框的可能性,因为
按钮
组件没有下拉框

我认为对于两个组件对象(
ComboBox
Button
)的解决方法是相同的,但我还没有找到解决方案。会在我更新时更新

更新:

我刚刚能够使用
validateNow()
实现这一点,几分钟后,我找到了以下链接:


本质上,该链接指示我们将
validateNow()
调用放在
EnterFrame
事件中,或者放在
SetTimeout
中,并进行适当的计时。

这是因为安装了Flash组件,如果您查看Flash IDEA中组件的第二帧,您可以看到它是返回初始大小的临时化身

要解决此问题,您应该迭代化身子对象并使其大小正常化:

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;
    }
}

这是因为Adobe愚蠢地植入了Flash组件,如果你在第二帧中看到一个Flash组件,你就会产生这样的想法