Apache flex 火花标签宽度

Apache flex 火花标签宽度,apache-flex,Apache Flex,我需要设置spark标签的文本,然后根据其宽度沿x轴放置此类标签。不幸的是,标签的宽度似乎没有立即更新,因此定位将失败。我可以监听标签上的updateComplete事件,然后更新其位置,但这意味着重新定位标签的频率要比我希望的高很多(updateComplete触发频率要比更改宽度时高很多)。关于如何正确处理看似微不足道的任务,有什么想法吗 下面是一个代码片段,它显示了我上面描述的内容。如果按下该按钮,您将看到3条痕迹:更改文本前的标签宽度,设置文本后的标签宽度,以及完成标签自身更新后的标签宽

我需要设置spark标签的文本,然后根据其宽度沿x轴放置此类标签。不幸的是,标签的宽度似乎没有立即更新,因此定位将失败。我可以监听标签上的updateComplete事件,然后更新其位置,但这意味着重新定位标签的频率要比我希望的高很多(updateComplete触发频率要比更改宽度时高很多)。关于如何正确处理看似微不足道的任务,有什么想法吗

下面是一个代码片段,它显示了我上面描述的内容。如果按下该按钮,您将看到3条痕迹:更改文本前的标签宽度,设置文本后的标签宽度,以及完成标签自身更新后的标签宽度。想知道是否有一种方法可以在不必收听updateComplete事件的情况下获得正确的宽度。。。按钮和VGroups就在那里运行示例

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            protected function button1_clickHandler(event:MouseEvent):void
            {
                trace("label width = ", lb.width);
                lb.addEventListener(FlexEvent.UPDATE_COMPLETE, lb_updateCompleteHandler);
                lb.text = "hello world!";
                trace("label width post change= ", lb.width);
            }

            protected function lb_updateCompleteHandler(event:FlexEvent):void
            {
                lb.removeEventListener(FlexEvent.UPDATE_COMPLETE, lb_updateCompleteHandler);
                trace("label width post update complete = ", lb.width);
            }

        ]]>
    </fx:Script>

    <s:VGroup>
        <s:Button label="go" click="button1_clickHandler(event)"/>
        <s:Label id="lb" text="h" x="10" y="10" />
    </s:VGroup>

</s:Application>


VGroup
是一个带有
垂直布局的
组。它不允许在组内进行自定义定位(使用
x
y
)。要实现这种可能性,请将
Group
与(默认值)
BasicLayout
一起使用,您可以在设置文本后调用lb.validateNow(),这样您将立即获得新的宽度。但建议您阅读有关组件生命周期的内容,不要有这样琐碎的问题


是的,正如人们已经指出的那样,在这样的布局中,没有任何重新定位会起作用。

看起来,倾听调整大小的事件会起作用,并且不像updateComplete事件那样普遍,所以我称之为“正确答案”。由于性能优化,当您试图手动定位资料时,可能有更好的方法可以做到这一点,尽管我还不确定它是什么。

如果使用,您可以“捕获”当前范围内的变量,但也可以在传播
宽度的更改后执行它。例如:

callLater(function():void
      {
        trace("label width in callLater = ", lb.width);
      });
更新:我想我应该再详细说明一下“捕获”价值的含义。这可以通过以下简单说明完成:

callLater(function(prevWidth:Number):void
      {
        trace("previous label width in callLater = ", prevWidth);  // 8
        trace("label width in callLater = ", lb.width);  // 64
      }, [lb.width]);
如示例所示,通过
args
数组传入的参数(即变为
prevWidth
[lb.width]
)采用当前值(即,它们按值传递),而,在函数中直接引用的变量实际上在函数执行时的作用域中(即a)


您也可以使用事件侦听器来执行此操作,但使用callLater()则更简单。

以下内容对我很有用。简单但有效

var l:Label = new Label();
l.text = "That'll do";
var tlm:TextLineMetrics = l.measureText( l.text);
Alert.show( tlm.width + " is what you are looking for");

我不明白你想要的布局,你能试着用不同的词解释一下你想要的东西是如何出现的,以及它们实际上是如何出现的吗?我希望标签有一个x位置,这取决于它的宽度。这有点笼统,但我希望没那么难想象……你到底想实现什么?我的意思是:最终结果应该是什么样的?也许你可以发布一个截图。我有一种感觉,你试图用艰难的方式做一些事情,但我不知道。我认为你是对的,我试图用艰难的方式做一些事情,我偶然发现了一个关于标签的有趣的一般性问题。最终目标:我有一个标签,需要在一堆其他东西的左边。标签可以改变长度,材料可以增长或收缩。我想HGroup会帮我处理业务,但我当时试图远离自动化布局(我正在优化一些项目渲染器),并认为我可以自己定位标签(毕竟应该没那么难)。谢谢你的帮助!如果您正在谈论项目渲染器的优化,您最好使用
mx.core.uiftextfield
mx.core.UITextField
编写您自己的基于ActionScript的项目渲染器,其中位于
updateDisplayList()
中。抱歉-VGroup与此问题无关,这只是一种独立定位按钮和标签的方法。will编辑问题-我显然写得不好:-)我尝试了validateNow,但令人惊讶的是,在这种情况下似乎没有做到这一点-不知道为什么。正如我在重新编辑中提到的,布局与问题无关。。。