2011-07-19 114 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

相關問題