2009-06-10 10 views
3

Ich habe ein Quiz-Spiel mit einer Cartoon-Frage-Blase gebaut. Die Blase wird an die Länge der Frage angepasst. Ich möchte ein Änderungsereignis in der dynamischen Textbox ändern, um eine Funktion aufzurufen, die die Größe der Fragenblase ändert.AS3 Textbox Change Event Nicht feuernd

Das Änderungsereignis wird jedoch nie aufgerufen, wenn mein Textfeldwert dynamisch aus Code geändert wird.

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

Ich möchte das Änderungsereignis verwenden, da es mehrere Orte in meinem Code sind, die question_txt eingestellt werden können. Wie kann ich das Textfeld veranlassen, das Änderungsereignis auszulösen?

Gibt es auch eine Möglichkeit, die Anzahl der Zeilen in Frage_txt zu zählen, um die Höhe von textBubble_mc genauer festzulegen?

Antwort

5

Ja, als David Kommentare, TextField sendet CHANGE-Ereignisse nur dann, wenn sie von Benutzereingaben bearbeitet werden. Dies gilt im Allgemeinen für die meisten Komponenten. Der Grund liegt natürlich darin, dass Sie, wenn Sie manuell versuchen, den Wert des Felds in Ihrem "change" -Handler zu ändern, einen rekursiven Zyklus von Ereignissen erstellen würden, bei denen Sie manuell den Weg nach draußen finden müssten.

Was Sie tun möchten, ist eine Wrapper-Funktion machen, wie:

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

Für Ihre andere Frage, gibt es keinen Grund das Textfeld Höhe basierend auf der Anzahl von Zeilen oder Zeichen zu schätzen - gerade gesetzt die text Eigenschaft, und Sie können sofort die height des Textfelds abfragen. Es wird genau die neue Höhe des Feldes widerspiegeln, und wenn Sie die Feldbreite ändern, wird die Höhe sofort aktualisiert usw.

Oder, wenn Sie irgendwelche feinen Details über die Größe des Textfelds wissen müssen, können Sie Verwenden Sie immer TextExtent.

+0

Ich habe am Ende nur eine Funktion aufgerufen, wie Sie in Ihrem Beispielcode angegeben haben. Für die zweite Frage möchte ich die Höhe Eigenschaft des Textfelds verwenden, aber es wird nicht automatisch die Größe geändert. Ich habe ein dynamisches Textfeld auf der Bühne und wenn das Textfeld zu klein ist, wird Text abgeschnitten. Ich sehe nichts in Flash, um die Textbox skalierbar zu machen. Ich werde die As3-Bibliothek überprüfen. Wissen Sie, wie Sie eine Textbox auf die Länge des Textes skalierbar machen können. – Bryan

+0

Ich habe es. question_txt.autoSize = TextFieldAutoSize.CENTER; Danke Fenomas! – Bryan

+0

Das ist nett, aber Sie können vorhandene Event.CHANGE-Handler nutzen, indem Sie question_txt.dispatchEvent aufrufen (new Event (Event.CHANGE)); – Triynko

7

Ich glaube nicht, dass das CHANGE-Ereignis ausgelöst wird, wenn Sie das Textfeld richtig mit As3 ändern. Aber man kann immer das Ereignis erhöhen durch:

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

Für die Anzahl der Zeilen in der Textbox, können Sie die numLines verwenden richtig der TextField-

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

+0

Vielen Dank David. Ich habe die numLines-Eigenschaft völlig vergessen. – Bryan

0

Wie ich die Lösungen sehe, ist dies eine andere Klasse, die das TextField erweitert. Beispielcode:

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

} 
}