Когда в Java GUI-приложении следует оповещать пользователя об изменении документа?

«Когда в Java GUI-приложении следует оповещать пользователя об изменении документа?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оповещение должно быть ненавязчивым и своевременным. Основные подходы:

1. Визуальный индикатор в заголовке окна

  • Добавляйте символ (например, *) к имени файла при наличии несохраненных изменений.
  • Это пассивное и непрерывное уведомление.

2. Модальные диалоги при критичных действиях

  • Попытка закрыть окно/приложение с несохраненными изменениями.
  • Попытка открыть новый документ без сохранения текущего.
  • Эти действия приводят к потере данных, поэтому требуют явного подтверждения.

Пример реализации в Swing:

// 1. Отслеживание изменений в документе
textDocument.addDocumentListener(new DocumentListener() {
    @Override
    public void changedUpdate(DocumentEvent e) {
        markAsModified();
    }
    // ... insertUpdate, removeUpdate
});

// 2. Метод для установки состояния "изменено"
private void markAsModified() {
    isModified = true;
    updateWindowTitle(); // Добавляет "*" к заголовку
}

// 3. Перехват попытки закрытия окна
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        if (isModified) {
            // Показать диалог подтверждения
            int option = JOptionPane.showConfirmDialog(frame,
                "Сохранить изменения?",
                "Документ изменен",
                JOptionPane.YES_NO_CANCEL_OPTION);
            // Обработать выбор пользователя
        } else {
            frame.dispose();
        }
    }
});

Почему так? Частые модальные диалоги раздражают. Стратегия "визуальный индикатор + диалог при риске потери данных" является стандартом для desktop-приложений.