Я много читал о Java, Swing, MVC и SwingWorker, но я совершенно не понимаю роль модели в MVC.
Я создаю приложение с двумя кнопками:
- выбрать файл
- прочитать файл
Существует также текстовое поле, используемое для ведения журнала.
Чем я сейчас занимаюсь:
- Представление содержит виджеты, но не логику
- Методы кнопки actionPerformed() вызывают метод контроллера.
- Контроллер будет получать необходимые данные (включая отображение OptionPane.showOpenDialog()) для получения файла
- Ссылка на файл хранится в модели.
- Модель уведомляет (PropertyChangeSupport, шаблон Observer) представление о новом файле.
- Просмотр включает кнопку «Читать файл»
Мой первый вопрос: следует ли хранить состояние в модели? То есть информация, относящаяся к последовательности операций: сначала нужно выбрать файл, прежде чем его можно будет прочитать. Тогда моя Модель станет конечной машиной.
Мой второй вопрос: правильно ли я позволяю контроллеру отображать панель параметров?
Затем начинается самое интересное. Пользователь нажимает кнопку «Читать файл». Я делаю примерно то же самое, что и с кнопкой "выбрать файл". Представление вызывает контроллер, но контроллер использует SwingWorker для чтения файла, поскольку это не следует делать в EDT. SwingWorker публикует промежуточные сообщения регистрации, которые добавляются в текстовое поле через ссылку на View (метод SwingWorker.process()). Контроллер прослушивает изменения свойства «состояние» от SwingWorker. Когда «состояние» равно «ГОТОВО», контроллер вызывает функцию «get()». Если все в порядке, результаты устанавливаются в Модель. В противном случае обрабатываются исключения.
Мой третий и самый важный вопрос: разве Модель не должна читать файл?! Весь смысл MVC заключается в разделении задач со всеми преимуществами (тестируемость и т. д.). Что делать, если мне нужно новое представление (например, интерфейс командной строки)? Тогда моя модель теперь будет только моделью данных. Он понятия не имеет, как читать файл! А как насчет проблем с резьбой?
Надеюсь, вы дадите мне хороший совет. В Интернете есть множество примеров о SwingWorker, MVC и т. д. Но моя проблема не в том, как кодировать их, а в том, как проектировать.