Ответ
Оповещение должно быть ненавязчивым и своевременным. Основные подходы:
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-приложений.