Flex: назначение событий динамически создаваемым кнопкам - PullRequest
0 голосов
/ 19 июля 2011

Спасибо Веззи и остальным, кто помог мне за последние пару дней. Я следовал их советам и пытался выяснить все остальное самостоятельно, но я снова застрял.

У меня есть текстовый файл, структурированный так:

button1_label
button2_label
button3_label

Моя программа создает эти 3 кнопки во время выполнения и помещает их в группу.

protected function onLoaded(e:Event):void {
                var myArrayOfLines:Array = e.target.data.split(/\n/);
                var tempBtn:Button;

                for(var i:Number = 0;i < myArrayOfLines.length;i++){
                    var j:Number = i+1;
                    tempBtn = new Button();
                    tempBtn.id = "btn" + i;
                    tempBtn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void{
                        var index:uint = parseInt(evt.currentTarget.id.replace("btn", ""));
                                    //TextArea code will go here

trace(text); // Traces null
                    });
                    tempBtn.label = myArrayOfLines[i];
                    btnArray.push(tempBtn);
                    group.addElement(btnArray[i]);
                }
            }

Теперь из моего кода видно, что я пытаюсь заставить каждую кнопку печатать строку в текстовой области. Я структурировал свой новый button.txt так:

button1_label
"Hello"
button2_label
"Goodbye"
button3_label
"Come again"

Так что я хочу сделать, чтобы button1 напечатал «Hello». Все строки файла .txt помещаются в myArrayOfLines. Заранее спасибо за любую помощь.

EDIT Полное объяснение

Извините, я пытался упростить свой вопрос, думаю, я усложнил понимание. Я сделал текстовый редактор, чем работает на стороне клиента, без сервера. У меня есть набор кнопок, которые вставляют предопределенные фразы в TextArea. У каждой кнопки есть прослушиватель, который выполняет myTextArea.insert ("sometext"); (но разный текст для каждой кнопки. Пользователи запросили возможность создавать свои собственные кнопки, чтобы вставить туда свои строки. Я подумал, что у меня будет пара текстовых входов, где пользователь может определить метку, и строка, которая будет вставлена ​​в textarea при нажатии кнопки. Я бы записал метку в одну строку, затем строку в следующую строку. Прямо сейчас я создал файл buttons.txt с этим форматом, чтобы посмотреть, будет ли он работать.

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: РАБОЧИЙ КОД

public function setupBtns(e:Event):void{
            var file:File = File.documentsDirectory.resolvePath("buttons.txt");
            var stream:FileStreamWithLineReader = new FileStreamWithLineReader();
            stream.open(file, FileMode.READ);

            while(stream.bytesAvailable) {
                // this line contains the headers like button1_label etc.
                var label:String;
                // this line contains the string

                if(stream.bytesAvailable) {
                    // this line contains the actual label like "Hello";
                    label = stream.readUTFLine();
                    line = stream.readUTFLine();

                    // strip off the first and last character as they are double quotes
                    line = line.substring(1, line.length-1);

                    var tempBtn:Button = new Button();
                    tempBtn.addEventListener(MouseEvent.CLICK, btnListener);

                    tempBtn.label = label;
                    tempBtn.name = line;
                    btnArray.push(tempBtn);
                    for(var i:Number = 0;i<btnArray.length;i++){
                        group.addElement(btnArray[i]);
                    }
                }
            }
        }           

        protected function btnListener(e:MouseEvent):void{
            mainTextField.insertText(e.target.name);    
            trace(e.target.name);
        }

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Попробуйте и дайте мне знать, как это работает ...

РЕДАКТИРОВАТЬ: (попробуйте новый код ниже)

        protected function onLoaded(e:Event):void {
            var myArrayOfLines:Array = e.target.data.split(/\n/);
            var tempBtn:Button;

            for(var i:Number = 0;i < myArrayOfLines.length;i=i+1){
                var j:Number = i+1;
                tempBtn = new Button();
                tempBtn.id = "btn" + i;
                tempBtn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void{
                        myTextArea.text += '\n' + myArrayOfLines[j];
                    });
                tempBtn.label = myArrayOfLines[i];
                btnArray.push(tempBtn);
                group.addElement(btnArray[btnArray.length-1]);
            }
        }           
0 голосов
/ 19 июля 2011

первый: не используйте анонимные функции в качестве слушателей в ActionScript - если вы летите, вы не сможете удалить их позже.

вместо этого используйте метод класса, подобный этому:

tempBtn.addEventListener(MouseEvent.CLICK, onMouseClick);

private function onMouseClick(evt:MouseEvent):void
{
  if (evt.currentTarget == button1_label)
  {
     // do sth for btn1
  }
  else if (evt.currentTarget == button2_label)
  {
     // do sth for btn2
  }
  // ...
}

редактировать

только что увидел, что вы используете идентификаторы, а затем просто измените приведенный выше код на что-то вроде этого:

if (evt.currentTarget.id == "btn1")
...