Вызов действия из контейнера внутри списка

У меня есть форма, в которой есть два компонента списка: первый служит меню и заполняется при запуске приложения (каждый элемент в списке представляет собой пустой контейнер с меткой и кнопкой, установленными в качестве средства визуализации), второй заполняется в соответствии с выбором пользователей. из меню. Поэтому я подумал, что можно подключить действие к кнопке в моем меню, поэтому я добавил для него новое событие действия, но проблема в том, что метод действия (onMenuItem_LinkButtonAction) никогда не вызывается. Я выполнил некоторую отладку, и причина в том, что переменная rootContainerName в методе handleComponentAction всегда является именем родительской формы, а не именем BlankContainer.

if(rootContainerName.equals("Main")) {
    // "Main" is form which contains both Lists
    if("linkButton".equals(c.getName())) {
        onMain_LinkButtonAction(c, event);
        return;
     }
 }
 if(rootContainerName.equals("MenuItem")) {
     //MenuItem is my BlankContainer, programm will never pass above condition
     if("linkButton".equals(c.getName())) {
         onMenuItem_LinkButtonAction(c, event);
         return;
     }
 }

Итак, есть ли способ поймать такое событие и получить информацию о кнопке, которая запустила событие?


person Petr Mensik    schedule 15.06.2014    source источник


Ответы (1)


Поскольку кнопка не имеет состояния (рендерер используется как резиновый штамп), она не будет работать таким образом. Хитрость заключается в том, чтобы прослушать действие, выполняемое в списке, а затем попытаться определить, была ли нажата кнопка.

Если вы используете GenericListCellRenderer (все средства визуализации, созданные с помощью GUI Builder, используют это), вы можете просто привести экземпляр средства визуализации к GenericListCellRenderer, затем вызвать extractLastClickedComponent() и предположить, что возвращаемая кнопка не является нулевой, проверьте, соответствует ли она кнопке ссылки.

Если нет, вам нужно привязать прослушиватель действий к кнопке ссылки и переключить флаг (ссылка нажата), а затем в прослушивателе действий списка, если этот флаг был установлен, переключить его обратно и выполнить соответствующую логику. Причина в том, что вы получаете событие кнопки, которое не имеет состояния, событие списка является важной частью.

См. http://www.codenameone.com/3/post/2013/12/deeper-in-the-renderer.html

person Shai Almog    schedule 16.06.2014
comment
Спасибо за ответ, Шай, извините, я не заметил эту статью, мне стало намного понятнее :) - person Petr Mensik; 16.06.2014
comment
Может быть, один дополнительный вопрос - я понял, что мне придется использовать компонент MultiButton внутри моего списка, так есть ли способ перехватывать события из него? Потому что в статье упоминается, что невозможно извлечь события из составных компонентов с помощью extractLastClickedComponent. Спасибо - person Petr Mensik; 16.06.2014
comment
Есть мультилист. К сожалению, так как экстракт ведущего компонента не будет работать в этом случае codenameone. com/3/post/2014/04/leading.html Даже если это так, у мультикнопки всего одна кнопка, все остальное — это метки. - person Shai Almog; 16.06.2014