【问题标题】:AS3 Textbox Change Event Not FiringAS3 文本框更改事件未触发
【发布时间】:2010-11-01 22:43:48
【问题描述】:

我制作了一个带有卡通问题泡泡的问答游戏。气泡会根据问题的长度调整大小。我想在动态文本框上设置一个更改事件来调用一个改变问题气泡大小的函数。

但是,当我的文本框值从代码中动态修改时,永远不会调用 change 事件。

 question_txt.addEventListener(Event.CHANGE, setTextBubbleSize);

 function setTextBubbleSize(event:Event):void
    {
        trace("QUESTION TEXT CHANGED");
        textBubble_mc.height = 30 + question_txt.text.length * 1.2;
        if (textBubble_mc.height > 170) textBubble_mc.height = 170;
        question_txt.y = textBubble_mc.y - textBubble_mc.height / 6 + 10;
    }

我想使用更改事件,因为我的代码中有几个地方可以设置 question_txt。如何让文本框触发更改事件?

另外,有没有办法统计question_txt中的行数来更准确地设置textBubble_mc的高度?

【问题讨论】:

    标签: actionscript-3 events dynamic textbox


    【解决方案1】:

    当我看到解决方案时,这是另一个扩展 TextField 的类。 示例代码:

    package {
    import flash.events.Event;
    import flash.text.TextField;
    
    public class MyTf extends TextField {
        public function MyTf() {
            super();
        }
    
        override public function set text(value:String):void
        {
            super.text = value;
            dispatchEvent(new Event(Event.CHANGE));
        }
    
    }
    }
    

    【讨论】:

      【解决方案2】:

      是的,正如 David cmets 一样,TextField 仅在用户输入编辑时才调度 CHANGE 事件 - 事实上,大多数组件通常都是如此。原因当然是因为如果您在“更改”处理程序中手动尝试更改字段的值,您将创建一个必须手动检测出路的事件的递归循环。

      你想做的是做一个包装函数,比如:

      function setQuestionText( s:String ):void
          {
              question_txt.text = s;
              setTextBubbleSize();
          }
      

      对于您的其他问题,没有理由根据行数或字符数来估计文本字段的高度-只需设置text属性,您就可以立即查询文本字段的height。它将准确反映字段的新高度,如果更改字段的宽度,高度将立即更新等。

      或者,如果您需要了解有关文本字段大小的任何详细信息,您可以随时使用TextExtent

      【讨论】:

      • 我最终只是调用了您在示例代码中指出的函数。对于第二个问题,我想使用文本字段的高度属性,但它不会自动调整大小。我在舞台上有一个动态文本框,如果文本框太小,文本会被截断。我在 Flash 中看不到任何东西来使文本框可调整大小。我将检查 as3 库。你知道如何让文本框根据文本的长度调整大小吗?
      • 我明白了。 question_txt.autoSize = TextFieldAutoSize.CENTER;谢谢 fenomas!
      • 这很好,但您可以通过调用 question_txt.dispatchEvent( new Event( Event.CHANGE ) ); 来利用现有的 Event.CHANGE 处理程序;
      • Triynko:好点子!但是,如果您稍后编辑处理程序代码以使用事件对象的 target 属性(或其他),则会导致问题。如果你想在未来证明它,你需要制作一个真实的事件对象。
      • fenomas,按照我的建议调用 dispatchEvent,确实调度了一个真实的事件。也许您将我的评论误解为建议直接调用处理程序,但这不是我所说的......我说过通过调用 dispatchEvent 来(间接)利用它们,这会生成一个真实的冒泡事件,并正确设置了 target 属性到 TextField 实例,因为它是直接从它分派的,并且事件甚至会冒泡,当 currentTarget 属性上升到它们的层次结构时更新它。
      【解决方案3】:

      我认为当您使用 as3 正确更改文本框时不会触发 CHANGE 事件。但您始终可以通过以下方式引发事件:

      dispatchEvent(new Event(Event.CHANGE, true));
      

      对于文本框的行数,可以适当使用TextField的numLines

      http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/text/TextField.html#numLines

      【讨论】:

      • 非常感谢大卫。我完全忘记了 numLines 属性。
      猜你喜欢
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多