Я думаю, что ваш лучший вариант - использовать 'Расширение AbstractTableModel с данными карты формы из JDBC ResultSet', потому что
- Java 6 JTable имеет встроенную поддержку сортировки, поэтому вам не нужно реализовывать это.
- Если вы тщательно спроектируете свою модель, вы сможете пережить некоторые изменения схемы. Четко кодируйте, чтобы вам было легче вносить изменения, если вам нужно.
- Вам все равно придется записывать изменения. Используйте кнопку «Сохранить», и пакетное обновление может даже улучшить вашу производительность.
- Вы можете переопределить TableCellEditor для предоставления комбинированного списка вместо текстового редактора по умолчанию.
- Не пытайтесь делать все изменения в одной таблице. Отделили средства для создания записи и т. Д.
- Вы можете добавлять / удалять столбцы в JTable во время выполнения. Просто fireTableModelChanged () и новый столбец становится видимым
Редактировать: Одна сумасшедшая вещь, которую я хотел бы сделать, чтобы создать собственный компонент и сделать все отрисовки самостоятельно и выполнять операции редактирования с хорошо расположенными JTextField и JComboBox.
Edit2: На основании вашего комментария.
Сохраните позицию выбранного элемента, прежде чем выполнить вызов fire ... (). Кстати, я не думаю, что вызов сбрасывает сортировку или выбор - не было никаких проблем с этим.
Если вы добавите столбец, вы можете просто получить ключевое поле и значения только для нового столбца. Отобразите их в столбце. Затем выполните скрытую полную перезагрузку в фоновом режиме и поменяйте модель на нее, когда она будет завершена. Это практически работает из нескольких ResultSets одновременно в одной таблице.
Удаление легко, так как вы не показываете значения для этого столбца.
Edit3:
DefaultRowSorter не такой глубокий. Он поддерживает таблицу переиндексации для ваших записей. Поэтому, когда JTable запрашивает 10-ую строку, сортировщик строк проверяет свою 10-ую запись индексной таблицы и извлекает этот элемент индекса из вашей фактической модели.
Также, если в вашей модели много одинаковых строк, используйте простой кэш Map of String to String при запросе данных из базы данных. Таким образом, тонны избыточных объектов String могут быть сразу получены GC-d.
Edit4:
Я бы запросил новое поле в Map of key to value, и моя основная модель содержала бы список map of value. Затем я бы использовал реализацию getValue (), которая возвращает значение из первичного источника данных из этих дополнительных карт по запросу. Я хотел бы найти ключ строки в основной модели и использовать его для получения фактического значения из дополнительных карт. (Кстати. Репутация, полученная из принятых ответов, не зависит от дневного лимита.)