Просмотр полной версии : Проблема с отображением компонентов spark.components во FlashDevelop
Пытаюсь создать комбо бокс в ФД + Flex SDK 4.
var comboBox:ComboBox = new ComboBox();
this.addChild(comboBox);
Для этого импортировал класс
import spark.components.ComboBox;
И подключил к проекту библиотеку spark.swc из папки с флексом.
В итоге, никаких ошибок не выдает, но и комбо бокс не появляется. И так не только с комбо боксом, а вообще со всеми компонентами из флекса.
Что я делаю не так?
Казалось бы, простая задача, а нагуглить ответ нереально. Все что находится, относится к mxml которого я вообще не понимаю.
Вот уж не знаю, почему нет ошибок... используйте addElement(comboBox)
.. Кто такой this?
this - это спрайт в который добавляются элементы. Если изменить на stage или что-то другое все равно ничего не изменится.
Вот уж не знаю, почему нет ошибок...
А с чего им взяться то?
используйте addElement(comboBox)
addElement какого класса? Пробовал и SkinnableComponent и Group, толку то. Не катит.
Так.. начнем с начала: документ-класс является наследником UIComponent? :)
Нет, а зачем? В UIComponent тоже нет метода addElement
Что-то адобовцы намудрили с этими компонентами. Наверное проще написать свои, чем разобраться с этими
Это метод SkinnableContainer'а. Забудьте про addElement. И про флексовый фреймворк тоже.
Если вам нужно что-то быстро сделать - пробуйте сами. Кроме того есть куча велосипедов вроде aswing (http://www.aswing.org/), astra (http://developer.yahoo.com/flash/astra-flash/), etc.
А с флексом нужно сесть и разобраться. Если оно, конечно, нужно.
К чему тогда были 2 предыдущих поста?
Это дело принципа. Чужие использовать не буду, свои всегда можно сделать (а потом еще не одну неделю исправлять баги), но мне нужно заставить работать компоненты флекса. Другие варианты и предложения не обсуждаются.
Я просто думал, что вы хоть немного "в теме". Сорри.
Вот, начните с этого (http://www.flasher.ru/forum/showthread.php?t=123261), чтобы мне не дублировать.
Как все замудрено :) Ладно, спасибо. Видимо правда не стоит оно того. Прийдется сесть и написать самому все необходимые компоненты
terbooter
07.02.2011, 19:44
Как все замудрено :) Ладно, спасибо. Видимо правда не стоит оно того. Прийдется сесть и написать самому все необходимые компоненты
На определенной стадии все пишут свои компоненты =)
Это хорошо
Блин, уже уперся рогом в это дело :D
Пишу комбо бокс, все бы ничего, открывается и наполняется элементами. Но как сделать так, чтобы он закрывался при щелчке где-то в другом месте (в смысле не по самому боксу)? Слушатель к сцене не подходит, так как не позволяет открыться комбо боксу, даже если useCapture = true;
Что-то я похоже туплю..
Слушатель к сцене не подходит, так как не позволяет открыться комбо боксу, даже если useCapture = true;
Слушатель на сцену вешайте при открытии комбобокса. После срабатывания удаляйте слушатель.
Делал. В таком случае не определяется на каком именно элементе произошел щелчок
trace(e.target); выдает [object ComboBox]
trace(ecurrentTarget); [object Stage]
если включить useCapture то оба варианта выдают [object Stage]
Делайте это внутри комбобокса. Или вы их решили глобально закрывать?
Или вы их решили глобально закрывать?
Ну да, желательно глобально. Чтобы любой открытый комбо бокс закрывался, даже если щелчок произошел по другому комбо боксу. Т.е. нужно поведение как у комбо боксов из Flash IDE
п.с. Но этот код то я пишу внутри комбо бокса. Или я что-то недопонимаю?
Добавлено через 2 часа 21 минуту
Класс написан, и работает :D Зря я вообще пытался использовать useCapture
Все работает и без этого, и слушатель добавляется только к сцене
п.с. Но этот код то я пишу внутри комбо бокса. Или я что-то недопонимаю?
Тогда зачем вам получать доступ через target? вы уже внутри, просто вызовите метод закрытия.
У меня внутри класса создаются еще дополнительные спрайты (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
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.