Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: GUI и Java FX приложения > совет по правильной архитектуре gui |
Автор: pycha 6.3.2017, 15:14 |
Приветствую. Хочу получить совет как правильно устроить архитектуру gui. У меня есть главный фрейм, к нему цепляю кучу панелек. Есть дефаултные панели, которые наследуются и дорисовуются дочерними, и потом дочерние добавляются во фрейм. На каждую панель сделал отдельный файлик класса, чтобы не впихивать все в один файл исходников, да и в конце концов это же обьектно ориентированное программирование. Все было хорошо пока рисовал и размещал панели, теперь взялся за обработку событий и тут начался гемор. Вот для примера изменение введенной строки в jTextFild в дефаултной панели, должен вызвать перерисовку фрейма с новыми данными. Как правильно организовать общение между этими разными классами? Я более склоняюсь к мысли что надо сделать элементы , которые взаимодействуют статическими и так перебрасываться между собой сообщениями, на для примера myGui это главный клас, он создает фрейм и хранит его в себе. Тогда чтобы вызвать перерисовку из дефаултного класса нужно будет просто сделать вот так myGui.frame.myRepaint(); это удобно и требует минимум кода , но считается ли это хорошим стилем? Есть еще вариант перебрасывать события от родительского к дочерним окнам, но как это сделать я не знаю, да и это потребует дополнительных обработчиков событий, что мне кажется не красиво. Еще вариант передавать от дочернего к родителю ссылки на фрейм , и прочие элементы , которые нужно задействовать. это мне тоже очень режет глаза - нужно будет передавать много параметров, при чем почти в каждую новую созданную панель. Я в джаве делаю первые шаги , как и в ооп. хочу добавить потом это приложение в свое портфолио поэтому так маюсь из за хорошего стиля. В общем дайте совет как лучше мне все организовать. |
Автор: vpf 6.3.2017, 18:12 |
Если к хранилищу фреймов обращаются все, то надо выделять его в отдельный класс, чтобы все имели равные права. Если обращается только один класс, то спрятать надо в него, и не париться. Ну я так думаю. |
Автор: pycha 7.3.2017, 13:52 | ||
vpf, там много классов. в основном все межклассовые обращения идут к фрейму, но в будущем еще возможно нужно будет добавить и общение между собой
а можно об этом поподробней? гугл при запросе "java модель" выдает "Модель памяти Java" и почитав описание показалось что это не то, что ты мне хотел посоветовать |
Автор: LSD 7.3.2017, 18:25 |
http://www.oracle.com/technetwork/java/architecture-142923.html |
Автор: pycha 10.3.2017, 17:41 | ||
спасибо, это походу какраз то что мне нужно. и (надеюсь) последний вопрос. решил разделить по образу MVC на gui, controller, data( по смыслу модель. класс , который хранит данные). после изменения текста в jTextFild мне нужно чтобы перерисовались несколько комбобоксов на разных панелях и изменились данные в data. решил сделать это так: в ответ на изменение jTextFild вызываю определенный метод в конролере. передаю ему новый текст и индекс для комбобоксов, которые нужно изменить. в этом методе в контроллере генерирую событие и все подписанные на это событие комбобоксы переписывают ячейку. таким же образом переписываются данные в data. вопрос в чем, правильно ли я понимаю: событие по факту одного типа , в нем хранится только текст и номер ячейки для изменения, значит его можно реализовать одним дефаултным классом. для разных групп комбобоксов , которые нужно будет изменять пачкой, достаточно будет создать разные интерфейсы для реализации ? (при этом передавать один класс события) . или же нужно будет создавать дополнительно отдельный класс события на основе дефаултного, для каждой из груп комбобоксов свой? ps (не по теме) еще подскажите пожалуйста как можно поменять в ячейке комбобокса текст по индексу , ибо я в притул не не разглядел в документации метода, который это делает. Пришлось написать костыли такого типа
оно помимо того что выглядит некрасиво , еще и тянет за собой событие комбобокса actionPerformed. Оно же тянет за собой выполнение ненужного кода , который должен выполняется только при смене индекса ячейки . Изменение текста ячейки там не важно |
Автор: pycha 11.3.2017, 23:15 |
с событиями сам разобрался. Вопрос насчет изменения текста ячейки комбобокса актуален |
Автор: LSD 13.3.2017, 15:58 | ||
Ты про прежнему неправильно работаешь с моделью. Ты должен менять модель, а модель (правильно написанная) сама оповестит об изменении всех кому это надо:
Основное внимание на метод setElementAt() там вначале меняются данные, а затем вызывается fireContentsChanged() вот именно он и скажет комбобоксу, что надо перерисовать строчку 2. |
Автор: pycha 14.3.2017, 01:39 | ||
завтра разберусь с кодом но еще раз прочитал о принципе mvc и понял что действительно не так у себя все устроил.
я было так : все слушатели на изменение регистрируются в контроллере. введенный текст передается контроллеру и оттуда пересылается всем слушателям ( и в модель и в представление). Теперь если я правильно понял, то мне нужно сделать иначе : все слушатели(комбобоксы) регистрируются в модели. введенный текст передается контроллеру , контроллер перенаправляет его в модель . модель изменяет свои данные и оповещает всех слушателей ( тоесть комбобоксы в view) что изменились данные и нужно переписать ячейку. верно? ну и еще тогда уж уточню о точной реализации. как лучше правильно инициализировать контроллер и модель? в классе MyGui создать по одному статическому обьекту класса ( и тогда к ним можно будет обращаться MyGui.model.tableListeners.addTableListener(...) ) , или полностью статические методы сделать чтобы можно было напрямую Model.tableListeners.addTableListener(...) ? |