Добавление иконок к Tree

2 views
Skip to first unread message

ruFlex

unread,
May 8, 2008, 5:29:16 AM5/8/08
to ruFlex
Появилась проблема которую никак не могу решить.

<mx:Accordion id="Accordion1" height="486" width="246">
<mx:Repeater id="r" dataProvider="{catalog}" startingIndex="0">
<mx:Form id="shippingAddress" label="{r.currentItem.@name}"
width="100%" height="100%">

<mx:Tree width="100%" height="100%" labelField="@name"
showRoot="false" dataProvider="{r.currentItem}"
change="treeChanged(event)" />

</mx:Form>
</mx:Repeater>
</mx:Accordion>

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

Alexander Budjakov (pride_conan)

unread,
May 8, 2008, 5:37:10 AM5/8/08
to ruf...@googlegroups.com
и в чем проблема?

Andrey Przhigotsky

unread,
May 8, 2008, 5:43:30 AM5/8/08
to ruf...@googlegroups.com
Проблема в том, что "деревенский" рендерер принимает картинки в виде Class, на не ByteArray, BitmapData или Bitmap. Т.е. надо извратнуться и в TreeItemRenderer, заоверрайдя пропертю data, подсовывать некий класс, который потом станет кастомной картинкой.

Alexander Budjakov (pride_conan)

unread,
May 8, 2008, 6:07:25 AM5/8/08
to ruf...@googlegroups.com
ага, саме так. Когда-то делал.

ruFlex

unread,
May 8, 2008, 6:21:47 AM5/8/08
to ruFlex
Проблема была частично решена неким Ben Stucki из Нешвиля.

http://blog.benstucki.net/?p=42

Он написал класс который в принципе легко использовать.
Вот пример.
<mx:Button id="example" label="Example"
icon="{IconUtility.getClass(example, 'http://www.exampledomain.com/
image.jpg')}" />

Я тут подумал что можно наверно в свойство initialize поставить
функцию, туда передавать текущее дерево и уже так как-то к элементам
привязывать картинки.
Однако не совсем понимаю, как это можно сделать в виду тотальной
неопытности.

Orion

unread,
May 8, 2008, 6:59:23 AM5/8/08
to ruFlex
public class CTreeIR extends TreeItemRenderer
{
public function CTreeIR()
{
super();
}

override public function set data(value:Object):void {

super.data = value; //value это типа что у тебя там за
инфа в ноде


TreeListData(super.listData).icon =
IconUtility.getClass(this, /*а тут и так все понятно*/);
}
}

данный класс запихиваешь как itemRenderer для твоего Tree

ruFlex

unread,
May 8, 2008, 8:13:13 AM5/8/08
to ruFlex
Ещё вопрос, если этот класс просто вставить в <mx:script /> тогда
компилятор ругается мол classes must not be nested.

Orion

unread,
May 12, 2008, 12:59:40 AM5/12/08
to ruFlex
Надобно в as файл поместить сию информацию, и файл сий реком будет
CTreeIR.as отныне и вовеки веков.

ruFlex

unread,
May 13, 2008, 8:46:11 AM5/13/08
to ruFlex
Огромное спасибо. Всё работает за исключением одного не маленького
бага. В если в компоненте Tree прокруткой скрыть несколько строк. А
потом обратно прокрутить, то иконок не видно. Появляются они после
того как к полосе подводишь мышь. Такое чувство что компонент выкружет
иконки, а когда подводишь мышь снова срабатывает TreeItemRenderer и
заново подгружает иконку. Где тут стоит копать, чтобы победить эту
проблему?

Orion

unread,
May 13, 2008, 11:34:45 PM5/13/08
to ruFlex
Ога, есть такая фича - это происходит потому, что на момент
"прикручивания" твоя картинка еще не успела подгрузится и он ее почему
то слопывает в 0, впрочем он ее почему тио слопывает в 0 и даже если
она вроде как подгрузилась... короче вот сюда:
IconUtility.getClass(this, /*а именно куда то сюда*/); пропиши
дефолтные размеры width height.

ruFlex

unread,
May 14, 2008, 3:20:08 AM5/14/08
to ruFlex
А вообще есть какая нибудь возможность кэшировать эти картинки, или
TreeItemRenderer всегда заново создаётся при появлении на экране
TreeItem?
Не то чтобы очень надо, просто при прокрутки иконки появляются с
задержкой где то в 0,3 секунды.

Orion

unread,
May 14, 2008, 4:51:58 AM5/14/08
to ruFlex
По сути в IconUtility вроде как есть система кеширования:
if(!loader.content) {
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
completeHandler, false, 0, true);
} else {
displayLoader(loader);
}

а по факту, при каждом запросе getClass лоадер инстанцируется заново и
dictionary перезаписывается:
///...
var loader:Loader = new Loader();
loader.load(new URLRequest(source as String), new
LoaderContext(true));

dictionary[target] = { source:loader, width:width, height:height };

можно в принципе выпасывать, а есть ли такой target в dictionary и как
то проверять не изменился ли source, а можно и не проверять, но тогда
не сможешь динамически менять изображения. ...хотя вся эта ботва не
сработает, если Трее пересоздает все itemRenderer'ы при смене узла...

или ввести дополнительный массивчег по source, куда записывать уже
отлоаденные картинки... :)

или вкручивать свой функционал в itemRenderer который будет заниматься
кешированием (хотя это скорее всего не получится)...

или копать Tree и смотреть, почему он каждый раз переприсваивает data
у itenRenderer'ов.

А вообще класс Tree это почти 3,5 килострочек аццкого кода и там есть
где разгуляться :)

PS: интересно, а какие из protected методов они в этом классе не
переопределили :)

ruFlex

unread,
May 15, 2008, 10:57:10 AM5/15/08
to ruFlex
Действительно, человек явно хотел сделать кэширование. Но сделал его
криво, а потому оно практически не работает. Ладно, попробуем
поправить.
Reply all
Reply to author
Forward
0 new messages