|
|
|
JTable JDBC некорректно сохраняет даные
|
|||
|---|---|---|---|
|
#18+
вообщем есть такая проблема. Когда редактируеш даные в таблице(Swing база - postgres) все работает нормально если после редактирования какойто ячейки мишкой перейти на другую. А если допустим отредактировать какуюто ячейку и сразу нажать ok то даные не обновляются в таблице. Я выяснил что метод SetValueAt вызывается при переходе на другую ячейку. А если после редактирования table нет перехода на другую ячейку то он не вызывается. Вообщем может смутно обясняю вот куски кода: tableModelProvider = new DataBaseEdit (driverName, url, query, user, passwd); ... resultTableProvider = new JTable(tableModelProvider); scrollPane = new JScrollPane(resultTableProvider); ... public boolean isCellEditable(int row, int col) { save_row = row; save_col = col; db_edit = true; try { System.out.println(" isCellEditable ok"); System.out.println(" row = " + row); System.out.println(" col = " + col); //System.out.println(" aValue = " + aValue); return dmetaData.isWritable(col+1); } catch (SQLException e) { return false; } //fireTableCellUpdated(row, col); //fireTableStructureChanged(); } public void setValueAt(Object aValue, int row, int column) { //Vector dataRow = (Vector)drows.elementAt(row); //dataRow.setElementAt(aValue,column); db_edit = false; System.out.println("db_edit in function= " + db_edit); try { PrepareSQL(row, column, aValue); } catch(Exception exception) { exception.printStackTrace(); System.out.println( "Provider Journal not ok" ); } Vector dataRow = (Vector)drows.elementAt(row); dataRow.setElementAt(aValue,column); fireTableCellUpdated(row, column); } Вопрос в следующем как получить даные из отредактированой ячейки если нет перехода на другую ячейку (но нажав кнопку ок котораю должна бы записать новую инфу в базу а пишет ту же что была до этого в базе точнее в Tablemodel). Помогите если кто наступал на эти грабли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 15:22 |
|
||
|
JTable JDBC некорректно сохраняет даные
|
|||
|---|---|---|---|
|
#18+
Во-первых, причем тут JDBC, если "проблемы" со swing таблицей? Во-вторых, совершенно правильно, что данные не сохраняются, т.к. никто не знает как поступать с ячейкой, в которой изменения ( сточки зрения самой таблицы) еще производятся и могут быть отменены в любой момент (если, очень хочется, то можно перехватывать нажатия клавишей и писать их в буфер (понадобится 1 буферная переменная на всю таблицу, которая будет содержать точное значение того, что есть в текущей редактируемой ячеке - ее и пишем в базу). Можно также по нажатию кнопки OK, сначала принудительно вызывать переход фокуса с таблицы, что и вызовет желаемый метод (не проверял!). В-третьих, это мое IMHO, не стоит давать пользователю возможность редактировать и добавлять данные непосредственно в таблицу. Это только на первый взгляд является самым привлекательным решением, на самом деле ввод и корректировка информации должны быть отдельным акцентированным процессом, по возможности исключающим случайные или не достаточно полные модификации. Грубо говоря, транзакция на уровне отдельной ячейки редкое явление (особенно для ввода), как правило, нужен логически непротиворечивый ввод целой строки. У нас (дело, правда было давненько) простой уход от "удобного" и "наглядного" редактирования непосредственно таблиц, к работе с отдельными формами ввода и корректировки информации уменьшил кол-во ошибок процентов на 20 и существенно снизил нагрузку на СУБД. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 17:18 |
|
||
|
JTable JDBC некорректно сохраняет даные
|
|||
|---|---|---|---|
|
#18+
>(если, очень хочется, то можно перехватывать нажатия клавишей и писать их в буфер (понадобится 1 >буферная переменная на всю таблицу, которая будет содержать точное значение того, что есть в >текущей редактируемой ячеке - ее и пишем в базу). А можно подробней как енту переменную перехватить бо чето у меня никак не получается. Мне уже больше из спортивного интереса интересно. Сам прихожу к выводу что такое user friend решение тянет за собой кучу проблем на ровном месте. Если исползовать tableModel.getValueAt() - то выдает старые даные из модели где еще ничего не успело поменяться. Насчет перевода фокуса на другой обект я так понимаю это что-то из методов JPanel? в который паковал таблицу. Вообщем ша буду смотреть как енто можно сделать. Не думал что енто решение имеет такие подводные камни :-). И еще вопросик а методы типа fireTableDataChanged(); - никак не помогут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 18:24 |
|
||
|
JTable JDBC некорректно сохраняет даные
|
|||
|---|---|---|---|
|
#18+
Точно не помню, ну, например, покопайте public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column), соответственно, для полученного компонента можно навесить свой Listener... "Не думал что енто решение имеет такие подводные камни " Технически камней особых нет (можно перехватить и закрытие приложения и т.п. и почти в любом случае записать данные в последней ячейке), а вот с точки зрения построения грамотного интерфейса IMHO есть и немалые. :) Да и с точки зрения СУБД весьма странное решение фактически коммитить каждую операцию не имею ни малейшей гарантии того, что это именно то, что нам нужно и эта операция атомарна. Грубо говоря, пока ваша СУБД это весьма относительно многопользовательская система, с небольшими таблицами, то работа с вводом новых данных непосредственно в экранное представление таблицы может казаться замечательным решением (тоже, кстати, самообман). Беда в том, что при усложнении системы такое решение частенько надо выбрасывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 10:56 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33593546&tid=2149936]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
411ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 673ms |

| 0 / 0 |
