В этом простом туториале мы научимся получать данные из модальных (и не только) окон 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); //здесь и только здесь мы можем использовать результат
} );
Теперь у нас есть модальное окно, возвращающее значение.