2014-01-27 6 views
1

Я добавил несколько MultiButton s динамически, и каждый из них имеет новый ActionListener. Когда ActionListener называется , он имеет тип Button, а не фактический объект MultiButton (то есть литой в MultiButton код ClassCastException не может отличить Button до MultiButton).Почему компонент 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(), действительно является кнопкой.

Update: Чтобы получить кнопку, как многокнопочные вы должны использовать:

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

А, я вижу. Поэтому я могу получить мультибаллон, перейдя к родительскому компоненту, возвращенному компоненту, и добавив * к * в мультибатту ... хотя это беспокоило бы меня, что я могу полагаться на это всегда так! – noelicus

+0

Правильно, я просто нашел это и отредактировал свой ответ. –

+0

Отличный ответ! Причиной этого является то, что ведущий компонент действует как обычная кнопка с совместимостью. Вы можете использовать: MultiButton clickedMb = (MultiButton) evt.getComponent(). GetParent(). GetLeadParent(); –

Смежные вопросы