2011-07-19 44 views
0

感谢wezzy和其他在过去几天帮助我的人。我一直在听取他们的意见,并试图找出其他问题,但我再次陷入困境。Flex:将事件分配给动态创建的按钮

我有结构化的这样一个txt文件:

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

现在你可以从我的代码中看到,我试图让每个按钮打印一个字符串到一个textarea。我已经构建了我的新buttons.txt,像这样:

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

所以我想要做的是让button1打印“你好”。 .txt文件的所有行都被推送到myArrayOfLines中。预先感谢您的帮助。

编辑 充分说明

对不起,我正在努力简化我的问题,我想我做更难理解。我做了一个文本编辑器,而不是运行客户端,没有服务器。我有一组按钮,它们将预定义的短语插入到TextArea中。每个按钮都有一个侦听器,它执行myTextArea.insert(“sometext”); (但每个按钮都有不同的文本,用户要求能够创建自己的按钮来插入自己的字符串,我想我会有一些用户可以定义标签的文本输入,以及一个可插入textarea on button click。我会将标签写入一行,然后将字符串写入下一行。现在,我创建了一个带有这种格式的buttons.txt文件,以查看它是否可以工作。

FINAL EDIT:WORKING CODE

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

一般认为适当的要求跟进信息时,编辑原来的问题。我不清楚这是一个真正的新问题还是基于这个问题。假设有足够的内容来量化一个新的问题(我会让你决定),我把'后续'文本去掉了你的主题。 – JeffryHouser

+0

对不起。我把另一个问题的答案标记为提前解决。我不确定我是否仍然可以发布该问题。这是基本相同的问题,但更详细和更改代码。我应该回到原来的帖子吗? – RapsFan1981

+0

我敢肯定你可以取消选择以前选择的答案。如果是这样,最好取消选择答案并编辑旧答案。不过,现在事情很混乱,因为你在这里得到答案。我怀疑如果我们离开它,任何人都会抱怨。 [但;从档案的角度来看;它可能会错误地说我以前的问题有一个“不正确/不完整”的答案,标记为正确的] – JeffryHouser

回答

0

第一:在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 
    } 
    // ... 
} 

编辑

刚才看到,您正在使用的ID,那么就改变上面的代码某事像这样:

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

试试这个,让我知道它是如何工作的...

编辑:(试试下面的新代码)

 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

靠近但仍有问题。它仍然为每行而不是每个第二行创建一个按钮,因此,例如,它会为Button1创建一个名为“Hello”的按钮,其中“Hello”应该是Button1的属性,而不是单独的按钮。同样,当他们点击时,他们显示的文字是'未定义'。 – RapsFan1981

+0

在代码中将i ++更改为i = i + 2。 ;) – Nate

+0

没有运气。尝试在我的循环,并认为也许你的意思是= i + 2,但都没有工作。即使尝试i = i + 2在循环的底部只是为了好玩:) – RapsFan1981

相关问题