2014-01-27 37 views
1

我已經動態添加了幾個MultiButton,每個都有一個新的ActionListener。當ActionListener被稱爲Component的類型爲Button而不是實際的MultiButton對象(即投向MultiButton導致ClassCastException不能投ButtonMultiButton)。爲什麼ActionEvent組件是錯誤的類型?

有沒有辦法讓MultiButton代替?還是我做了一些愚蠢的事情?

代碼:

Container cBob = findContainerBob(f); 

cBob.removeAll(); 

for (String str : things) { 
    MultiButton mb = new MultiButton(); 
    mb.setTextLine1(str); 

    mb.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      MultiButton clickedMb = (MultiButton)evt.getComponent(); // Throws exception     
     });   

    cBob.addComponent(mb); 
} 
+2

如果你投給了錯誤的類型,你沒有得到一個'null'值 - 你會得到一個'ClassCastException'。所以你的描述沒有意義,這很難幫助你。 –

+0

哦。是。我的意思是。問題已更新。個人記憶錯誤:這實際上是我在星期五開始寫的一個問題,我錯誤地記住了確切的症狀! - 仍然普遍的問題仍然是相同的 - 爲什麼它是錯誤的類型? – noelicus

+0

什麼_exactly_是'MultiButton'?這不是一個標準組件 –

回答

2

http://code.google.com/p/codenameone/source/browse/trunk/CodenameOne/src/com/codename1/components/MultiButton.java?r=317

如果你看一下在codenameone的多按鍵的源代碼,你會看到這樣的方法:

/** 
* Adds an action listener 
* 
* @param al the action listener 
*/ 
public void addActionListener(ActionListener al) { 
    emblem.addActionListener(al); 
} 

徽章是其成員,並宣佈爲按鈕:

private Button emblem = new Button(); 

所以你用evt.getComponent()調用得到的組件確實是一個按鈕。

更新: 爲了讓您的按鈕作爲多按鍵,你應該使用:

MultiButton multiButton = (MultiButton) evt.getComponent().getParent().getLeadParent(); 
+0

啊,我明白了。因此,我可以通過返回組件的父項並將*轉換爲多按鈕來獲得多按鈕...雖然它會擔心我可以依靠這種方式始終如此工作! – noelicus

+0

對,我剛剛發現這個,並編輯了我的答案。 –

+0

很好的回答!這背後的原因是讓主導組件像一個具有兼容性的普通按鈕一樣行事。您可以使用:MultiButton clickedMb =(MultiButton)evt.getComponent()。getParent()。getLeadParent(); –

相關問題