|
|
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть необходимость при изменении содержимого ячейки в таблице, получить это изменённое значение. На таблицу натянута модель, реализующая абстрактную. Кусок из мануала: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Мой код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Мой код не работает. Не могу понять, в чём дело. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 17:55:05 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Чтобы изменения таблицы отображались в модель, надо переопределить setValueAt. Это подробно описано практически везде. Что то типа такого Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 09:37:18 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
В модель данные загружаются из OracleCachedRowSet (rowSet в коде) Переопределил setValueAt: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. На таблице по прежнему не видно изменений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 10:25:07 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Ошибся: fireTableCellUpdated(rowIndex, colIndex); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 10:26:53 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Ещё добавлю, что приложение не имеет непосредственного коннекта к БД. rowSet получается из сервлета ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 10:28:49 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Блин, ну вы как маленький. Программист должен учиться сам искать в чем проблема, с помощью гуглов, мозгов - имеет значение только что сам. Замените CachedRowSet на обычный список объектов - тестовый, посмотрите так работает или не. Отсюда уже можно дальше копать и делать соответствующие выводы. В интернетах есть уже готовые реализации для модели таблицы - наберите CachedRowSetTableModel, не поленитесь - можно посмотреть как вообще народ делает и видоизменить под себя. И вообще CachedRowSet - специфичная штука, которая на стороне сервера сжирает приличные размеры памяти, зависящие от размера подмножества в результирующем запросе. Т.е. если строк тысяча, другая еще норм - но десятки тысяч - будет кирдык. Вот ссылки первые, что были, а то вдруг у вас гугл забанен одын два Плюс, насколько я помню, все изменения в CachedRowSet фиксируются отдельным методом acceptChanges(). Такого не увидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 14:29:39 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Была описана конкретная проблема в конкретных условиях, Вы предложили альтернативный вариант решения данной проблемы не через событие, а прямо в модели. Предложенный Вами вариант не дал результата уже по какой-то другой причине. Если вы не знаете в чём причина, то не вопрос, вы мне ничего не должны. Но ваш последний совет равносилен фразе "Почитайте Хорстманна\Корнелла, Том 1, там где-то про Swing есть". Спасибо, конечно, за ответ. Но если Вы не удосужились вникнуть в суть вопроса и Вам нечего сказать по существу, можно было бы и не писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 15:12:47 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
accept4ever, Какой конкретно тип у вашей TableModel и где вы ей создаёте, и присваиваете таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 15:32:11 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. Остальные методы тоже переопределены, но к данной теме не относятся. Присвоение модели в таком виде: Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 15:40:18 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Значит table.getModel().addTableModelListener(this); вызывается до jTable1.setModel(ocrstm); Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 15:43:59 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
rpf.jTable1.getModel().addTableModelListener( new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); System.out.println(data); } } ); вызывается после применения модели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 15:51:07 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
accept4everвызывается после применения модели Из кода этого не очевидно. А так как нужна строгая последовательность, то есть смысл писать ocrstm.addTableModelListener() А не table.getModel().addTableModelListener() Потому что даже если эта последовательность сейчас соблюдается, то никто не мешает её нарушить в будущем. Так как две операции находятно в явной зависимости, то не писать их последовательно в одном методе это раскладывать себе грабли. И если вы нас не обманули и последовательность правильная, то остаётся просто продебажить fireTableCellUpdated(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 15:57:03 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Не обижайтесь - я вам предложил конкретный путь - заменить ваш дасурс на тестовый из нескольких строчек в виде списка, чтобы исключить возможные проблемы, недопонимания работы и т.д. с CachedRowSet. Вы это проигнорировали и по прежнему ждете готового ответа пуляя обрывками кода, который посчитали нужным выложить. Ну пусть народ гадает, что у вас там за чем и где регистрируется и объявляется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 15:57:50 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Обманывать Вас мне смысла нет, я же сюда за советом пришёл. Понял свою ошибку. Я думал, что реализация setValueAt - это другой путь, чтобы не реализовывать TableModelListener. Сейчас tableChanged срабатывает, но возвращает значение из модели ocrstm, а не введённое в таблицу на форме. Вот полный листинг кода (листинг модели чуть выше) в классе, который управляет формой: public OracleCachedRowSet getReportParametersList(String reportName) { ParameterVector requestVector = new ParameterVector(); requestVector.add(new Parameter("action","GET_ACTION_PARAMETERS_LIST")); requestVector.add(new Parameter("action_name",reportName.toUpperCase())); responseObject = osr.readFromServlet(requestVector); oracleCachedRowSet = (OracleCachedRowSet)responseObject; if (oracleCachedRowSet.size() == 0) { javax.swing.JOptionPane.showMessageDialog(null,"Такого отчёта не существует...\n"); return null; } else { return oracleCachedRowSet; } } public void showParametersListForm() { rpf = new ReportParametersFrame(this); rpf.setModal(true); rpf.setLocationRelativeTo(rf); ocrstm = new OracleCachedRowSetTableModel(getReportParametersList(reportName)); rpf.jTable1.setModel(ocrstm); rpf.jTable1.getModel().addTableModelListener( new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); System.out.println(data); } } ); rpf.setVisible(true); } oneHalf, я не обижаюсь. В OracleCachedRowSet есть данные, они видны на таблице при применении модели. Проблема ведь в другом совсем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 16:14:42 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
accept4everОбманывать Вас мне смысла нет, я же сюда за советом пришёл. Понял свою ошибку. Я думал, что реализация setValueAt - это другой путь, чтобы не реализовывать TableModelListener. В первом вопросе не было никаких setValueAt(); accept4everСейчас tableChanged срабатывает, но возвращает значение из модели ocrstm, а не введённое в таблицу на форме. Значит никто не сохранил введенное значение в модели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 16:26:35 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ первом вопросе не было никаких setValueAt(); Правильно. Когда я задавал первый вопрос setValueAt и не был реализован. Реализовать предложил комрад oneHalf. Я подумал, что это другой способ и, если реализовать setValueAt, то не нужно будет реализовывать TableModelListener. BlazkowiczЗначит никто не сохранил введенное значение в модели. Так в этом и заключается вопрос. Если setValueAt сейчас уже реализован, более того реализован TableModelListener, то почему не сохраняется введенное значение никуда вообще? Ни в модель ни в system.out не выводится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 16:40:04 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Всё понял. Ларчик просто открывался: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 16:42:32 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Когда юзер что-то вводит, вызывается setValueAt() - который абстрактная модель не реализует, так как у неё нет хранилища. На кой хрен его оставили пустым, а не абстрактным - не понятно. setValueAt() должен вызывать fire, который просто передаёт местонахождение изменений. Если getValueAt() у вас возвращает старое значение, то собственно всё зависит от того как вы реализовали setValueAt(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 16:45:55 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Вот: public void setValueAt(Object newVal, int rowIndex, int colIndex) { try { rowSet.absolute(rowIndex+1); rowSet.updateObject(colIndex+1, newVal); fireTableCellUpdated(rowIndex, colIndex); } catch (SQLException e) { throw new NullPointerException(e.getMessage()); } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 16:49:29 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
accept4everВот: На счет вашего "Вот:", oneHalf уже ответил выше. Откуда вы знаете что updateObject изменило состояние закешированых данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 16:56:31 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Возьмите DefaultTableModel вместо абстрактной. Куча проблем решится сразу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 18:45:43 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Penkov VladimirВозьмите DefaultTableModel вместо абстрактной. Куча проблем решится сразу Угу. И как её к другому источнику данных привязывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 11:10:36 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Решил проблему путём добавления дополнительного вектора для хранения введенных данных. Вот код, может кому пригодится: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Но вопрос на тему: почему rowSet.updateObject() не обновляет данные, остаётся открытым. Предложенный выше rowSet.acceptChanges() нужен для того, чтобы постить изменения сразу в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 11:38:05 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
accept4everНо вопрос на тему: почему rowSet.updateObject() не обновляет данные, остаётся открытым. А почему должен? Что говорит дока к методу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 11:48:39 |
|
||
|
Вопрос по JTable
|
|||
|---|---|---|---|
|
#18+
Вроде как должен: void updateObject(int columnIndex, Object x) throws SQLException Updates the designated column with an Object value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 12:14:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38423198&tid=2128402]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 401ms |

| 0 / 0 |
