PDA

Просмотр полной версии : Проблема с отображением компонентов spark.components во FlashDevelop


goodguy
07.02.2011, 15:50
Пытаюсь создать комбо бокс в ФД + Flex SDK 4.
var comboBox:ComboBox = new ComboBox();
this.addChild(comboBox);
Для этого импортировал класс
import spark.components.ComboBox;
И подключил к проекту библиотеку spark.swc из папки с флексом.

В итоге, никаких ошибок не выдает, но и комбо бокс не появляется. И так не только с комбо боксом, а вообще со всеми компонентами из флекса.
Что я делаю не так?
Казалось бы, простая задача, а нагуглить ответ нереально. Все что находится, относится к mxml которого я вообще не понимаю.

Lou
07.02.2011, 16:07
Вот уж не знаю, почему нет ошибок... используйте addElement(comboBox)

.. Кто такой this?

goodguy
07.02.2011, 16:27
this - это спрайт в который добавляются элементы. Если изменить на stage или что-то другое все равно ничего не изменится.

Вот уж не знаю, почему нет ошибок...
А с чего им взяться то?
используйте addElement(comboBox)
addElement какого класса? Пробовал и SkinnableComponent и Group, толку то. Не катит.

Lou
07.02.2011, 16:51
Так.. начнем с начала: документ-класс является наследником UIComponent? :)

goodguy
07.02.2011, 17:27
Нет, а зачем? В UIComponent тоже нет метода addElement
Что-то адобовцы намудрили с этими компонентами. Наверное проще написать свои, чем разобраться с этими

Lou
07.02.2011, 18:17
Это метод SkinnableContainer'а. Забудьте про addElement. И про флексовый фреймворк тоже.
Если вам нужно что-то быстро сделать - пробуйте сами. Кроме того есть куча велосипедов вроде aswing (http://www.aswing.org/), astra (http://developer.yahoo.com/flash/astra-flash/), etc.
А с флексом нужно сесть и разобраться. Если оно, конечно, нужно.

goodguy
07.02.2011, 18:20
К чему тогда были 2 предыдущих поста?
Это дело принципа. Чужие использовать не буду, свои всегда можно сделать (а потом еще не одну неделю исправлять баги), но мне нужно заставить работать компоненты флекса. Другие варианты и предложения не обсуждаются.

Lou
07.02.2011, 18:57
Я просто думал, что вы хоть немного "в теме". Сорри.
Вот, начните с этого (http://www.flasher.ru/forum/showthread.php?t=123261), чтобы мне не дублировать.

goodguy
07.02.2011, 19:05
Как все замудрено :) Ладно, спасибо. Видимо правда не стоит оно того. Прийдется сесть и написать самому все необходимые компоненты

terbooter
07.02.2011, 19:44
Как все замудрено :) Ладно, спасибо. Видимо правда не стоит оно того. Прийдется сесть и написать самому все необходимые компоненты
На определенной стадии все пишут свои компоненты =)
Это хорошо

goodguy
07.02.2011, 19:50
Блин, уже уперся рогом в это дело :D
Пишу комбо бокс, все бы ничего, открывается и наполняется элементами. Но как сделать так, чтобы он закрывался при щелчке где-то в другом месте (в смысле не по самому боксу)? Слушатель к сцене не подходит, так как не позволяет открыться комбо боксу, даже если useCapture = true;
Что-то я похоже туплю..

alatar
07.02.2011, 20:04
Слушатель к сцене не подходит, так как не позволяет открыться комбо боксу, даже если useCapture = true;
Слушатель на сцену вешайте при открытии комбобокса. После срабатывания удаляйте слушатель.

goodguy
07.02.2011, 20:07
Делал. В таком случае не определяется на каком именно элементе произошел щелчок
trace(e.target); выдает [object ComboBox]
trace(ecurrentTarget); [object Stage]

если включить useCapture то оба варианта выдают [object Stage]

alatar
07.02.2011, 20:12
Делайте это внутри комбобокса. Или вы их решили глобально закрывать?

goodguy
07.02.2011, 20:19
Или вы их решили глобально закрывать?
Ну да, желательно глобально. Чтобы любой открытый комбо бокс закрывался, даже если щелчок произошел по другому комбо боксу. Т.е. нужно поведение как у комбо боксов из Flash IDE

п.с. Но этот код то я пишу внутри комбо бокса. Или я что-то недопонимаю?

Добавлено через 2 часа 21 минуту
Класс написан, и работает :D Зря я вообще пытался использовать useCapture
Все работает и без этого, и слушатель добавляется только к сцене

alatar
07.02.2011, 22:40
п.с. Но этот код то я пишу внутри комбо бокса. Или я что-то недопонимаю?
Тогда зачем вам получать доступ через target? вы уже внутри, просто вызовите метод закрытия.

goodguy
07.02.2011, 22:43
У меня внутри класса создаются еще дополнительные спрайты (Item внутренний класс расширяющий спрайт), в которые встраиваются текстфилды с названиями элементов, для того, чтобы можно было все это дело украсить, передав спрайту крутую графику :D. Количество спрайтов зависит от количества ячеек массива dataProvider (ну, как обычно). Так вот e.target и есть какой-то из этих спрайтов.

Каркас такой (если интересно):

package
{
import flash.display.LineScaleMode;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.MouseEvent;
import flash.filters.DropShadowFilter;
import flash.text.TextField;

public class ComboBox extends Sprite
{
private var _data:Array = ["first item", "second item"];
private var _label:String = "label";
private var _width:Number = 120;
private var _height:Number = 20;
private var _items:Array;
private var _labelTF:TextField;
private var textOffset:int = 5;

public function ComboBox()
{
drawGraphics();
}

private function drawGraphics():void
{
graphics.clear();
graphics.lineStyle(1, 0x444444, 1, false, LineScaleMode.NONE);
graphics.beginFill(0xD8D8D8);
graphics.drawRect(0, 0, _width, _height);
graphics.endFill();
_labelTF = new TextField();
_labelTF.selectable = false;
_labelTF.mouseEnabled = false;
_labelTF.autoSize = "none";
_labelTF.width = _width - textOffset;
_labelTF.text = _label;
_labelTF.x = textOffset;
this.addEventListener(MouseEvent.CLICK, openList);
this.addChild(_labelTF);

addContents();
}

private function openList(e:MouseEvent):void {
var initialY:Number = _height;
for (var i:String in _items) {
_items[i].y = initialY;
this.addChild(_items[i]);
initialY += _height;
}
stage.addEventListener(MouseEvent.CLICK, closeList);
}

private function closeList(e:MouseEvent):void {
var i:String;
if (e.target is Stage) {
for (i in _items) {
if (this.contains(_items[i]))
this.removeChild(_items[i]);
}
stage.removeEventListener(MouseEvent.CLICK, closeList);
} else {
if (e.target is Item) {
trace(e.target.itemName) // вот здесь можно вызывать функции зависящие от выбранного элемента
label = e.target.itemName;
for (i in _items) {
if (this.contains(_items[i]))
this.removeChild(_items[i]);
}
}
}
}

private function addContents():void {
_items = [];
for (var i:String in _data) {
var container:Item = new Item(_width);
container.graphics.clear();
container.graphics.lineStyle(1, 0x444444, 1, false, LineScaleMode.NONE);
container.graphics.beginFill(0xD8D8D8);
container.graphics.drawRect(0, 0, _width, _height);
container.graphics.endFill();
container.addEventListener(MouseEvent.ROLL_OVER, shade);
container.addEventListener(MouseEvent.ROLL_OUT, unshade);
container.itemName = String(_data[i]);
_items.push(container);
}
}
private function shade(e:MouseEvent):void {
e.target.filters = [new DropShadowFilter(0, 45, 0x000000, .3, 6, 6, 1, 3, true)];
}
private function unshade(e:MouseEvent):void {
e.target.filters = [];
}


// ==========================================
////////// SETTERS AND GETTERS //////////////
// ==========================================
public override function set width(width:Number):void {
_width = width;
drawGraphics();
}
public override function get width():Number {
return _width;
}
public override function set height(height:Number):void {
_height = height;
drawGraphics();
}
public override function get height():Number {
return _height;
}
public function set label(label:String):void {
_label = label
_labelTF.text = label;
}
public function get label():String {
return _label;
}
}
}
// HELPER CLASS
import flash.display.Sprite;
import flash.text.TextField;
class Item extends Sprite
{
private var _name:String = "item name";
private var _nameTF:TextField;
private var textOffset:int = 5;
public function Item(width:Number) {
_nameTF = new TextField();
_nameTF.selectable = false;
_nameTF.mouseEnabled = false;
_nameTF.autoSize = "left";
_nameTF.text = "item name";
_nameTF.x = textOffset;
_nameTF.width = width - textOffset;
this.addChild(_nameTF);
}
public function set itemName(itemName:String):void {
_name = itemName;
_nameTF.text = itemName;

}
public function get itemName():String {
return _name;
}
}




http://www.flasher.ru/forum/image.php?u=67641&dateline=1296634964