Как правильно реализовать MVC в Java с Swing?

Если вы хотите получить более подробную информацию, пожалуйста, дайте мне знать или обратитесь к последним строкам этого вопроса. Я уже много читал, и я чувствую, что превращаю что-то просто в нечто сложное, и я все еще застрял здесь и там, поэтому, может быть, вы можете помочь мне в этих очень конкретных вопросах.

Я использую Netbeans IDE 7 и JDK 7, и никаких фреймворков. Первое окно - это JFrame, а все остальные окна - JDialogs с modal = true.

Вопросы:

  • Как правильно реализовать шаблон MVC с помощью swing? Из идей ниже Какой из них лучше: (A) или (B)? Или, может быть, еще один... Почему это лучше?

    (А) Главная:

    MyModel model
    MyView view(model)
    

    MyView:

    MyController(this, model)
    

    (В)
     Main:

    MyModel model
    MyView View
    MyController controller(view, model)
    
  • когда я нажимаю jbutton1 в MainFrame, мне нужно его, чтобы открыть SettingsFrame для редактирования настроек. где я должен создавать экземпляр View, Model и Controller для параметра SettingsFrame? В контроллере MainFrame?

  • С точки зрения организации и реализации MVC, как мне обращаться с более конкретными функциями, которые (по-видимому) не хватает одной или двух из "ножек" MVC (либо Model, либо View или Controller)? Должен ли я создавать для них пустые классы?

    a. The implementation of a TrayIcon
    b. A URL connection class (an HttpsUrlConnection which will update data in the main jframe and also upload/download files)
    c. A Directory Monitor (which will update data in the main jframe and also use the urlconnection to download a file)
    d. My own implementation of TableModel
    e. json
    
  • Как правильно сохранить и использовать объект с настройками через все приложение? Мне понадобится информация в разных местах (Views, Models, Controllers), но она может быть изменена пользователем во время выполнения). Является ли хорошей идеей сделать эту модель одиночной?

  • Что делать, если:

    a. View needs some data from the Model? 
    What I'm doing: using the reference of Model which I keep in the View
    b. View needs some data from the Controller?
    What I'm doing: using the reference of Controller which I keep in the View
    c. Model needs some data from the Controller?
    Still didn't happen but I have no idea how to do correctly
    d. Model needs some data from the View?
    What I'm doing: pulling all my hair from my head...
    e. Controller needs some data from the View?
    What I'm doing: using the reference of the View which I keep in the Controller
    f. Controller needs some data from the Model?
    What I'm doing: using the reference of the Model which I keep in the Controller
    g. One of FooModel, FooView or FooController needs data from one of BarModel, BarView or BarController?
    What I'm doing: thinking of jumping from the highest building...
    
  • Любые подсказки о том, как узнать, правильно ли я реализовал MVC? Должен ли я обрабатывать массивные данные в модели или контроллере?

  • Я также использую DAO, что я делаю: моя модель имеет

    ArrayList MyModel load()

    который создает экземпляр DAO и возвращает ArrayList моделей, возвращаемых DAO, а затем иногда я обрабатываю этот ArrayList моделей в модели, и иногда я разрешаю контроллеру обрабатывать его. Это хорошая практика или есть лучший способ? Под процессом я имею в виду: итерацию через ArrayList и получение данных из моделей.

  • У меня есть проверка пароля jDialog, чтобы ограничить доступ к некоторым представлениям. Как я могу повторно использовать его с точки зрения MVC, чтобы я мог использовать тот же диалог PasswordCheck, чтобы разрешать/ограничивать доступ к различным представлениям, не делая беспорядок в коде?

  • Любые другие советы, подсказки, идеи, предложения?

Контекст: Я должен разработать программное обеспечение Java Swing MVC за короткое время, хотя по умолчанию я не являюсь разработчиком Java и не так привык к реализации шаблона MVC, особенно на Java (я получаю эту идею, но иногда мне не хватает знаний для реализации взаимосвязи между классами). Приложения - это, в основном, монитор для локальных/онлайн файлов с JTable в главном фрейме для отображения этих данных. Я использую новый WatchService API для отслеживания локальных файлов и сохранения их информации в базе данных h2 с помощью DAO, и они перезагружают эти данные в главном фрейме jtable. Я также должен уведомить пользователя о новых файлах (для которых я использую TrayIcon). Для онлайн-мониторинга файлов/загрузки/загрузки я использую HttpsUrlConnection и json. Он также может разрешить настройку настроек.

Заранее благодарим за вас время и помощь.

Ответы

Ответ 1

Посмотрите предложения Sun (Oracle).

В качестве одного упрощения вы можете зарегистрировать каждый компонент (модель, представление, контроллер) с помощью компонента приложения верхнего уровня, чтобы обеспечить единую точку отсчета, а не отдельные ссылки между каждым компонентом (ваши A или B). В статье, которую я цитирую, представлены идеи для создания push и pull; Я бы рекомендовал толчок как более популярный современный подход. Раскрытие информации: у меня есть опыт работы с Java и MVC, но не MVC в Swing как таковой.

где мне следует создать экземпляр представления, модели и контроллера SettingsFrame?

Конечно, да или в компоненте приложения верхнего уровня.

как я должен обрабатывать более конкретные функции, которые (по-видимому) не хватает или две из "ножек" MVC (либо Модель, либо Вид или Контроллер)?

Я бы использовал GUI-объекты только как свою собственную графическую библиотеку. И чисто алгоритм/сервисные части как библиотека сервисов.

Должен ли я обрабатывать массивные данные в модели или контроллере?

Алгоритмы обработки данных будут хорошо вписываться в контроллер или даже в библиотеку обслуживания; ваша модель не должна много обрабатывать, кроме, возможно, преобразования или проверки типов данных.

Как правильно сохранить и использовать объект с настройками через все приложение?

См. мою записку о регистрации; может быть целесообразным однострочный.