|
Модераторы: LSD, AntonSaburov |
|
pycha |
|
|||
главный анастазиолог Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
Приветствую. Хочу получить совет как правильно устроить архитектуру gui.
У меня есть главный фрейм, к нему цепляю кучу панелек. Есть дефаултные панели, которые наследуются и дорисовуются дочерними, и потом дочерние добавляются во фрейм. На каждую панель сделал отдельный файлик класса, чтобы не впихивать все в один файл исходников, да и в конце концов это же обьектно ориентированное программирование. Все было хорошо пока рисовал и размещал панели, теперь взялся за обработку событий и тут начался гемор. Вот для примера изменение введенной строки в jTextFild в дефаултной панели, должен вызвать перерисовку фрейма с новыми данными. Как правильно организовать общение между этими разными классами? Я более склоняюсь к мысли что надо сделать элементы , которые взаимодействуют статическими и так перебрасываться между собой сообщениями, на для примера myGui это главный клас, он создает фрейм и хранит его в себе. Тогда чтобы вызвать перерисовку из дефаултного класса нужно будет просто сделать вот так myGui.frame.myRepaint(); это удобно и требует минимум кода , но считается ли это хорошим стилем? Есть еще вариант перебрасывать события от родительского к дочерним окнам, но как это сделать я не знаю, да и это потребует дополнительных обработчиков событий, что мне кажется не красиво. Еще вариант передавать от дочернего к родителю ссылки на фрейм , и прочие элементы , которые нужно задействовать. это мне тоже очень режет глаза - нужно будет передавать много параметров, при чем почти в каждую новую созданную панель. Я в джаве делаю первые шаги , как и в ооп. хочу добавить потом это приложение в свое портфолио поэтому так маюсь из за хорошего стиля. В общем дайте совет как лучше мне все организовать. --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
vpf |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 119 Регистрация: 14.11.2016 Где: Moscow Репутация: нет Всего: нет |
Если к хранилищу фреймов обращаются все, то надо выделять его в отдельный класс, чтобы все имели равные права.
Если обращается только один класс, то спрятать надо в него, и не париться. Ну я так думаю. Это сообщение отредактировал(а) vpf - 6.3.2017, 20:05 |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15708 Регистрация: 24.3.2004 Репутация: 38 Всего: 537 |
Ну там вообще-то должна быть модель, которая оповестит вью что надо перерисоваться. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
pycha |
|
|||
главный анастазиолог Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
vpf, там много классов. в основном все межклассовые обращения идут к фрейму, но в будущем еще возможно нужно будет добавить и общение между собой
а можно об этом поподробней? гугл при запросе "java модель" выдает "Модель памяти Java" и почитав описание показалось что это не то, что ты мне хотел посоветовать --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15708 Регистрация: 24.3.2004 Репутация: 38 Всего: 537 |
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
pycha |
|
|||
главный анастазиолог Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
спасибо, это походу какраз то что мне нужно. и (надеюсь) последний вопрос.
решил разделить по образу MVC на gui, controller, data( по смыслу модель. класс , который хранит данные). после изменения текста в jTextFild мне нужно чтобы перерисовались несколько комбобоксов на разных панелях и изменились данные в data. решил сделать это так: в ответ на изменение jTextFild вызываю определенный метод в конролере. передаю ему новый текст и индекс для комбобоксов, которые нужно изменить. в этом методе в контроллере генерирую событие и все подписанные на это событие комбобоксы переписывают ячейку. таким же образом переписываются данные в data. вопрос в чем, правильно ли я понимаю: событие по факту одного типа , в нем хранится только текст и номер ячейки для изменения, значит его можно реализовать одним дефаултным классом. для разных групп комбобоксов , которые нужно будет изменять пачкой, достаточно будет создать разные интерфейсы для реализации ? (при этом передавать один класс события) . или же нужно будет создавать дополнительно отдельный класс события на основе дефаултного, для каждой из груп комбобоксов свой? ps (не по теме) еще подскажите пожалуйста как можно поменять в ячейке комбобокса текст по индексу , ибо я в притул не не разглядел в документации метода, который это делает. Пришлось написать костыли такого типа
оно помимо того что выглядит некрасиво , еще и тянет за собой событие комбобокса actionPerformed. Оно же тянет за собой выполнение ненужного кода , который должен выполняется только при смене индекса ячейки . Изменение текста ячейки там не важно Это сообщение отредактировал(а) pycha - 10.3.2017, 17:47 --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
pycha |
|
|||
главный анастазиолог Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
с событиями сам разобрался. Вопрос насчет изменения текста ячейки комбобокса актуален
--------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15708 Регистрация: 24.3.2004 Репутация: 38 Всего: 537 |
Ты про прежнему неправильно работаешь с моделью. Ты должен менять модель, а модель (правильно написанная) сама оповестит об изменении всех кому это надо:
Основное внимание на метод setElementAt() там вначале меняются данные, а затем вызывается fireContentsChanged() вот именно он и скажет комбобоксу, что надо перерисовать строчку 2. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
pycha |
|
|||
главный анастазиолог Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
завтра разберусь с кодом но еще раз прочитал о принципе mvc и понял что действительно не так у себя все устроил.
я было так : все слушатели на изменение регистрируются в контроллере. введенный текст передается контроллеру и оттуда пересылается всем слушателям ( и в модель и в представление). Теперь если я правильно понял, то мне нужно сделать иначе : все слушатели(комбобоксы) регистрируются в модели. введенный текст передается контроллеру , контроллер перенаправляет его в модель . модель изменяет свои данные и оповещает всех слушателей ( тоесть комбобоксы в view) что изменились данные и нужно переписать ячейку. верно? ну и еще тогда уж уточню о точной реализации. как лучше правильно инициализировать контроллер и модель? в классе MyGui создать по одному статическому обьекту класса ( и тогда к ним можно будет обращаться MyGui.model.tableListeners.addTableListener(...) ) , или полностью статические методы сделать чтобы можно было напрямую Model.tableListeners.addTableListener(...) ? Это сообщение отредактировал(а) pycha - 14.3.2017, 15:23 --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |