Мое почтение всем. Прошу прощения за некоторый отход от тематики форума, но есть вопрос. Столкнулся с такой задачей: проектирование пользовательского интерфейса "с нуля". Язык -- Java (J2ME). Все, что у меня есть -- событие "keyPress"/"keyRelease". Со вопросами отрисовки, вроде, справился. Основной затык -- диспетчеризация событий. Т.е. схема получается такая: некоторый объект имеет фокус, о чем он сам знает и отрисовывает себя соответствующим образом. Вопрос в том, как узнать, что у объекта есть фокус? Я решил это таким путем: существует класс, содержащий все окна в массиве и имеющий индекс объекта, который на данный момент в фокусе. Когда происходит нажатие кнопок вниз/вверх, Focuser узнает об этом и передвигает у себя фокус. Такая схема хороша для простых объектов Button, Edit, etc. Проблема начинается с более сложными элементами, например, ComboBox. Он содержит в себе Button и элементы выпадающего списка. Как управлять фокусом в них? Я решил так: объекты, по сути, имеют древовидную структуру, т.е. сложные контролы содержат в себе другие контролы, значит и фокус должен передаваться по дереву. Получается, что каждый объект может иметь свой Focuser для дочерних контролов, которые, в свою очередь, имеют (или не имеют) свой Focuser и т.д. Беда в том, что мне все это не нравится. Во-первых, хочется максимального отделения диспетчеризации фокусов и сообщений объектам от реализации самих объектов, т.е. чтобы объекты просто получали keyPress/keyRelease и реагировали. Во-вторых, схема не очень удобна: когда происходит потеря фокуса, родительское окно не знает, может ли оно терять фокус -- возможно его держит какой-то дочерний объект (фокус передается последовательно c элемента на элемент). Значит, приходится опрашивать все дерево фокусеров. Соотвтственно, вопрос. Как можно сделать архитектуру более простой и элегантной? Наверняка существует более-менее отлаженная схема. Нужно, конечно, погрузиться в чтение, но сделать надо быстро и качественно, поэтому спрашиваю здесь. Заранее благодарен за ответ.
Xerx Есть такая мысль. Беда в том, что Swing довольно монструозная вещь и мне нужно лишь подмножество его возможностей, а конкретно -- передача фокуса и диспетчеризация сообщений. Диспетчеризация сообщения сама по себе проистекает из проблемы фокуса, т.к. по фокусам можно прогнать сообщение по всему дереву контролов, как я понимаю. +у меня нет мышки, которая есть в Swing, что замедлит копание в исходниках. Но, думаю сейчас хотя бы в AWT попробовать разобраться -- он, вроде, проще.
_basmp_ Так это не ассемблер совсем . Это Java. Платформа -- J2ME (MicroEdition), для сотовых телефонов. ring4 Да.
_basmp_ Где скачать не знаю, т.к. взял компоненты не в интернете и поэтому даже не интересовался. Для программирования требуется сама Java (JDK) + Wireless ToolKit. JDK можно скачать с java.sun.com. Тот, которым пользуюсь я (jdk-1_5_0_14) весит 54 MB. WTK 2.2 c апдейтом и туториалом весят 20 МВ. Этого, в принципе, достаточно чтобы запустить программу на Java в эмуляторе. Если надо -- могу выслать/выложить компоненты.
Программирование под платформу J2ME напоминает чем-то DOC. А если хотите програмировать "круто" как под Win32, то берите в разработку телефон с операционкой симбион, там будет и многозадачность, и sdk под определенные марки телефона, дают офигительные возможности.
device При чем здесь книга по J2ME? Вопрос по архитектуре программы. На каком языке она написана, в принципе, неважно. Платформу я указал, чтобы было понятнее. ring4 Ну, в J2ME не все так уж плохо. С DOSом сравнение не совсем корректно. DOS -- ОС, а J2ME -- библиотека и окружение. Но если бы у меня был выбор, я бы вообще сотовыми не занимался, скорее всего.
Mika0x65 Я в курсе, вот потому и говорю, что "посмотеть как там", а не взять оттуда. Но без мышки тяжело, там очень многое на нее завязано насколько помню. AWT проще конечно, но не сильно популярно в тех кругах, где я сталкивался с Java. А про программирование мобильников в целом. Я это делал вообще в VS2005, так что в этом случае вообще не советник.
Xerx Посмотрел-таки вчера AWT. Библиотека действительно не очень популярная, но она проще чем Swing. Если я правильно их понял, то я на верном пути. В итоге, сделаю так: 1. При потере/получении фокуса опрашивается все дерево объектов до последнего, содержащего только простые контролы. Если он не против потерять фокус, то объект лишается фокуса и фокус устанавливается на следующий объект. 2. Сообщения диспетчеризуются, опять же, "по фокусу", Focuser получает сообщение и спрашивает у объекта в фокусе, передавать ли его ниже. Если объект согласен и содержит подобъекты, то сообщение передается дальше. Думаю, будет довольно удобно.