AsWing и модальные окна

В этом простом туториале мы научимся получать данные из модальных (и не только) окон AsWing

Создадим простой класс, показывающий модальное окно...

class ModalWindow extends Sprite
{
        public var frame : JFrame;  //окно AsWing, понадобится извне
       
        public function new()  {
                super();
        }

        public function Show() {
               
                var frame = new JFrame(this, "MyDialog", true);   //parent, caption, is_modal
                frame.setSize(new IntDimension( 400, 50 );    //размер

                //сделаем кнопки ОК и Cancel           
                var buttonOK = new JButton("OK");
                var buttonCancel = new JButton("Cancel");
               
                //у JFrame две области - title (заголовок окна) и content, мы добавляем компоненты ко второй
                frame.getContentPane().setLayout(new GridLayout(1, 2));     //в две колонки на всю ширину
                frame.getContentPane().append(buttonOK);   //добавим к окну кнопки
                frame.getContentPane().append(buttonCancel);

                //здесь надо сделать обработчики нажатия кнопок
                //добавим их чуть позже

                //отобразим окно
                Lib.current.stage.addChild(this);
                frame.show();
       }
}

Теперь, если мы попробуем запустить код, приведенный выше, например так:

var modalDialog = new ModalWindow();
modalDialog.Show();
trace("hello, world");

то обнаружим, что модальные окна в AsWing - не совсем модальные.
На экране будет создано окошко с двумя кнопками (и кнопкой "закрыть" сверху), которое заблокирует все, что под ним, до того, как его закроют. Тем не менее, trace() выполнится сразу, чтобы вернуть управление обработкой событий, и чтобы узнать, какая кнопка нажата, нужно немного потрудиться.

Для начала, нам понадобится обработчик нажатия кнопок:

//в переменные-члены класса
var dialogResult : Bool;

//в конструктор
dialogResult = false;

//в функцию Show()

var self = this; //разыменовать для замыкания
buttonOK.addActionListener(function(e) {       //обработчик нажатия кнопки (действие по умолчанию)
        self.dialogResult = true;   //установить возвращаемое значение
        self.frame.tryToClose();                //закрыть диалоговое окно
} );
       
buttonCancel.addActionListener(function(e) { fr.tryToClose(); } );

Когда кнопки стали работать, в основной программе нам нужно получить значение из диалогового окна.
Для этого поймаем событие org.aswing.events.PopupEvent.POPUP_CLOSED

var modalDialog = new ModalWindow();
modalDialog.Show();
modalDialog.frame.addEventListener(PopupEvent.POPUP_CLOSED, function(e) {
        trace (modalDialog.dialogResult);    //здесь и только здесь мы можем использовать результат
} );

Теперь у нас есть модальное окно, возвращающее значение.

Комментарии

Странно

Почему-то некорректно работает лайот, не поможете понять в чем проблема ? Вот весь тестовый код

package ;

import flash.display.Sprite;
import flash.Lib;
import haxe.Log;
import org.aswing.geom.IntDimension;
import org.aswing.GridLayout;
import org.aswing.JButton;
import org.aswing.JFrame;

/**
 * ...
 * @author Ekstazi
 */


class Application extends Sprite
{
       
        public function new()
        {
                super();
                //Log.trace(Lib.current.stage.stageHeight);
                //this.showFrame();
        }
       
        public function showFrame()
        {
        var frame = new JFrame(this, "MyDialog", false);   //parent, caption, is_modal
        frame.setSize(new IntDimension( 400, 50 ));    //размер
                //frame.setDragEnabled(true);
        //сделаем кнопки ОК и Cancel            
        var buttonOK = new JButton("OK");
        var buttonCancel = new JButton("Cancel");
                buttonOK.setHeight(25);
                buttonOK.setPreferredHeight(25);
                //buttonOK.setAlignmentY();
                buttonCancel.setHeight(25);
        //у JFrame две области - title (заголовок окна) и content, мы добавляем компоненты ко второй
        frame.getContentPane().setLayout(new GridLayout(1, 2));     //в две колонки на всю ширину
        frame.getContentPane().append(buttonOK);   //добавим к окну кнопки
        frame.getContentPane().append(buttonCancel);
               
        //здесь надо сделать обработчики нажатия кнопок
                //добавим их чуть позже
        //отобразим окно
        //Lib.current.stage.addChild(this);
                this.addChild(frame);
                frame.show();
        }
       
        static function main()
        {
                var self:Application = new Application();
                Lib.current.addChild(self);
                //self.width = Lib.current.stage.stageWidth;
                //self.height = Lib.current.stage.stageHeight;
                self.showFrame();
        }
}

Разобрался,

Разобрался, haxeAswing пока очень сырой. Проблема в нем. Придется базовый (as3 версию юзать).

Лайот заработал

Пока не добавил AsWingManager.initAsStandard(flash.Lib.current); лайот работал некорректно.

Абсолютные кординаты и грид

И еще вопрос - зачем вы используете абсолютные кординаты если у вас и так GridLayout ?

сорри,

сорри, переписывал со своего конструктора окошек, поэтому так много ляпов

у меня было пропущено var fr = frame;
дописал self, вроде в следующей версии Николя Каннасе обещал сделать автоматическое создание замыкания для this

можно кинуть свое сообщение, просто нашлось готовое

действительно для грида неактуально, убрал
код создания компонентов обычно берется из GuiBuilder'а, он лепит много лишнего

теперь в haXe 2.08

теперь в haXe 2.08 замыкания для this и всех членов класса в локальных функциях создаются автоматически

Хм

Может лучше свое событие назвать для данного примера ? К примеру, OnSuccessDialog и извне вешать на него обработчики ? И у вас опечатка по-моему, вместо fr должно быть frame.

P.S.: Я с aswing еще не имел дело, так что огромное спасибо за статью.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. The supported tag styles are: <foo>, [foo].
  • Use [gist:####] where #### is your gist number to embed the gist.

Подробнее о форматировании

CAPTCHA
Для отсева спамеров)
S
R
d
Y
e
1
Enter the code without spaces and pay attention to upper/lower case.