2016-04-16 5 views
0

これは私を悩ましています。私の目標は、テキストフィールドを介してテキストをステージに書き込むことです(同時に複数のテキストフィールドがあります)。しかし、ボタンを一度にすべてのテキストを削除できるようにしたい。AS3エラー#2025:提供されたDisplayObjectは呼び出し元の子でなければなりません。子を削除しようとしているとき

私は望んだとおりのテキストを持っています。ステージは、テキストフィールドのない親

stage.addEventListener(MouseEvent.MOUSE_UP, mUp); 
function mUp(MouseEvent): void { 

var textfield = new TextField(); 
textfield.type = TextFieldType.INPUT 
textfield.x = mouseX; 
textfield.y = mouseY; 
stage.focus = textfield; 
textfield.selectable = false; 
stage.addChild(textfield); // adding the child here 
} 

function erase(evt: MouseEvent): void { //triggers when button is clicked 

stage.removeChild(textfield) //trying to remove the child, but throws the error 
} 

されています:

だから基本的に私は、彼らはもう見ていないので、テキストフィールドの子を削除するには、ボタンをしたいが、私はこのエラーを得続ける、ここに私のコードです?私はそれに子供のようにテックスフィールドを追加しましたので、私はなぜそうは見えません。

これは非常にstraightfoward見て、私は問題を見ていないよ、どんな手助けが

var board: Sprite = new Sprite(); // displayobjectcontainer to hold the textfields 
addChild(board); 
var textfield:TextField; // Declared outside the functions 

listener.addEventListener(MouseEvent.MOUSE_UP, mUp); // I added an object on the stage to catch my mouse input instead of the stage, so that it doesn't trigger when I click my button 

function mUp(evt:MouseEvent):void 
{ 
textfield = new TextField(); // I have this still so it will create a new textfield on every mUP 
textfield.type = TextFieldType.INPUT 
textfield.x = mouseX; 
textfield.y = mouseY; 
stage.focus = textfield; 
textfield.selectable = false; 
board.addChild(textfield); // adding the child to the sprite now 
} 

function erase(evt:MouseEvent):void 
{ 
board.removeChild(textfield) //trying to remove the child, but still throws    the error 
} 

答えて

1

textfieldいいだろうが機能mUpのローカル変数です。関数eraseの内部にも存在しません。

両方の関数の外部で変数を宣言します。 (ところで:stageに何も追加しません)

var textfield:TextField; 

stage.addEventListener(MouseEvent.MOUSE_UP, mUp); 

function mUp(evt:MouseEvent):void 
{ 
    textfield = new TextField(); 
    textfield.type = TextFieldType.INPUT 
    textfield.x = mouseX; 
    textfield.y = mouseY; 
    stage.focus = textfield; 
    textfield.selectable = false; 
    addChild(textfield); // adding the child here 
} 

function erase(evt:MouseEvent):void 
{ 
    removeChild(textfield) //trying to remove the child, but throws the error 
} 

あなたはまだ直面している問題は、あなたがマウスボタンを放すたびにトリガするstageMOUSE_UPイベントを登録していることです。

これには、ボタンのクリックが含まれます。その上で

は、単一のtextfield変数が1つのオブジェクトのみを保持することができないという問題ですが、あなたの要件は次のとおりです。

ので、必要に一度

に複数のテキストフィールドがあるだろう作成したすべてのTextFieldオブジェクトをArrayなどに格納するか、共通のDisplayObjectContainerのようにグループ化するなどの方法で保存します。ここで

+0

私はOPで自分のコードを改訂しました。 しかし、それでも同じエラーが発生します。あなたが言ったことをすべて変更したと思います。これは私が配列を使用する必要がありますか?私はそれらをDisplayObjectContainerに格納することを前提としていたでしょうが、動作していないか、何か他のものが欠けていますか? – user3418126

+0

上記のことを気にしないで、私の明確な機能はまだ子供が追加されて表示されません実現する、私は回避策を見つけるだろう、助けをありがとう – user3418126

+0

@ user3418126 't​​extfield'という名前であなたのプロジェクトに何か他にありますか?エラーはボタンを押すたびに発生しますか? 'erase()'の 'trace(textfield.parent);から何を得るのですか? – null

0

取り組んでいる例:http://wonderfl.net/c/omKl

再開するには:

  • ステージ上で直接要素を追加していないが、あなたのメインのドキュメントまたはコンテナ
  • に配列にあなたのテキストフィールドを覚えるん(ベクターに入れたほうがいい)
  • テキストフィールドをコンテナに入れておくと、将来一度にそれらをすべて操作することが簡単になります(不透明度、位置など)

    package { 
    
    import flash.text.TextFieldType; 
    import flash.text.TextField; 
    import flash.events.MouseEvent; 
    import flash.events.Event; 
    import flash.display.Sprite; 
    public class Main extends Sprite { 
        private var textsContainer:Sprite; 
        private var textfieldsList:Array; 
    
        public function Main() { 
         addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 
        } 
    
        protected function addedToStageHandler(event:Event):void { 
         removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 
    
         textfieldsList = new Array(); // Array to memorize the textfields 
         textsContainer = new Sprite(); // Textfields container 
         addChild(textsContainer); 
    
         addEraseButton(); 
    
         stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler); 
        } 
    
        // Erase Button 
        private function addEraseButton():void { 
         var btn:Sprite = new Sprite(); 
         btn.graphics.beginFill(0xFF0000, 1); 
         btn.graphics.drawCircle(0, 0, 20); 
         btn.graphics.endFill(); 
         btn.x = btn.y = 25; 
         btn.buttonMode = true; 
         addChild(btn); 
    
         btn.addEventListener(MouseEvent.CLICK, eraseBtn_clickHandler); 
        } 
    
        private function eraseBtn_clickHandler(event:MouseEvent):void { 
         // remove all the textfields memorized in the list 
         for each(var tf:TextField in textfieldsList) { 
          textsContainer.removeChild(tf); // remove child from it's parent 
         } 
    
         // reset textfields list 
         textfieldsList.length = 0; 
    
        } 
    
    
        private function stage_mouseUpHandler(event:MouseEvent):void { 
         if(event.target == stage) { // check if target is stage to only add textfield when needed 
          var tf:TextField = new TextField(); 
          tf.type = TextFieldType.INPUT; 
          tf.x = mouseX; 
          tf.y = mouseY; 
          tf.border = true; 
          tf.backgroundColor = 0xCCCCCC; 
          tf.background = true; 
          tf.multiline = false; 
          tf.height = 20; 
          stage.focus = tf; 
          tf.selectable = false; 
          textsContainer.addChild(tf); // add textfield to a container 
          textfieldsList.push(tf); // memorize the textfield 
         } 
        } 
    
    
    } 
    } 
    
関連する問題