Новичок
Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.6.2008
Репутация: нет Всего: нет
|
Извините за может быть глупый вопрос. пишу на ява впервые. Хочу сделать так чтоб во время работы с таблицей изменения в базу передавались в другом потокe не тормозя редактирование таблицы. Это методы updrow(), addrow(), и delrow(). Особенно волнует updrow(), т.к. обновляет данные после изменения каждой ячейки. Пытался почитать форумы и литературу ниче не получилось, поэтому потоки вообще убрал, так хоть работает. Покажите пожалуйста на примере одного из этих методов как вызвать работающий поток для общения с ораклом, не мешая при этом редактировать таблицу в окне. Заранее спасибо. Сорри за длинный код. | Код | import javax.swing.*; import javax.swing.event.TableModelListener; import javax.swing.event.TableModelEvent; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.*; import java.sql.*; import java.awt.*; import java.awt.event.*; import java.util.concurrent.Callable; import java.math.BigDecimal; import java.math.BigInteger;
public class baseTable { private JTable table1; private JPanel Jpanel1; private JScrollPane jsp1; private conOracle co = new conOracle();//это мой клас там только соединение с ораклом private Object [][] datacards; private Object [][] datatests; private Object [][] datares; private String framename; private String query; private Object [][] data; private Object [][] tempdata; private String [] colHeads; private tblModel tm; private int table_num; public baseTable(int table_id) throws SQLException {
switch (table_id) { // Это просто выбор таблицы какая будет отбражаться case (1): table_num= table_id; query = "Select * From Cards ORDER BY CARD_ID";// order by CREATOR, CARD, MANUFACTURER, M_SIZE, M_TYPE"; framename = "Таблица Видеокарты (CARDS)"; baseTable.this.showTable (query); baseTable.this.showFrame (framename); break; case (2): table_num= table_id; query = "Select * From Tests ORDER BY TEST_ID";// ORDER BY TEST, DX_VERSION"; framename = "Таблица ТЕСТЫ (TESTS)"; colHeads = new String [4]; baseTable.this.showTable (query); baseTable.this.showFrame (framename); break; case (3): table_num= table_id; query = "SELECT * FROM RESULTS ORDER BY RES_ID";// ORDER BY RES_ID, TEST_ID, CARD_ID, RESULT, OVER"; framename = "Таблица Результаты (Results)"; baseTable.this.showTable (query); baseTable.this.showFrame (framename); break; } CellEditorListener l = new CellEditorListener(){ public void editingStopped(ChangeEvent e) { updrow(table_num); //отпраляет запрос на обновление данных в базе } public void editingCanceled(ChangeEvent e) { } }; TableCellEditor [] tce=new TableCellEditor[6]; for (int i=1; i<table1.getColumnCount();i++){ tce[i-1]=table1.getDefaultEditor(table1.getColumnClass(i)); tce[i-1].addCellEditorListener(l); table1.getColumn(table1.getColumnName(i)).setCellEditor(tce[i-1]); }
table1.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { super.keyPressed(e); if (e.getKeyCode()== KeyEvent.VK_ENTER){ if((table1.getSelectedRow()+1==table1.getRowCount())||(table1.getRowCount()==0)){ if(table1.isEditing()){ int ic=table1.getEditingColumn(); table1.getDefaultEditor(table1.getColumnClass(table1.getEditingColumn())).stopCellEditing(); //знаю что криво но по другому не работает } addrow(table_num); //добаляет пустую строку к таблице return; } } if(e.getKeyCode()== KeyEvent.VK_DELETE){ delrow(table_num); } } });
} public void addrow (int table_id){ //Добаляет 1 пустую строку к таблице в окне и соответсвенно в базе
String query1 = ""; int rowcount=0; int colcount = colHeads.length; if (data == null){ rowcount = 0; } else{ rowcount = data.length; } tempdata=data; data=new Object [rowcount+1][colcount]; for (int i = 0; i< rowcount; i++ ){ for (int j = 0; j< colcount; j++ ){ data[i][j] = tempdata [i][j]; } } Connection conn = co.conn; switch (table_id){ case (1): query1 = "{call ADD_CARD (?, ?, ?, ?, ?, ?)}"; try { CallableStatement cst = conn.prepareCall(query1); cst.setNull(1, java.sql.Types.VARCHAR); cst.setNull(2, java.sql.Types.VARCHAR); cst.setNull(3, java.sql.Types.VARCHAR); cst.setNull(4, java.sql.Types.VARCHAR); cst.setNull(5, java.sql.Types.INTEGER); cst.setNull(6, java.sql.Types.VARCHAR); cst.executeQuery(); baseTable.this.showTable (query); } catch (SQLException e1) { e1.printStackTrace(); JOptionPane.showConfirmDialog(null, "Ошибка данных", "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); return; } break; case (2): query1 = "{call ADD_TEST (?, ?, ?)}"; try{ CallableStatement cst = conn.prepareCall(query1); cst.setNull(1, java.sql.Types.VARCHAR); cst.setNull(2, java.sql.Types.VARCHAR); cst.setNull(3, java.sql.Types.VARCHAR); cst.executeQuery(); baseTable.this.showTable (query); } catch (SQLException e1) { e1.printStackTrace(); JOptionPane.showConfirmDialog(null, "Ошибка данных", "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); return; } break; case (3): query1 = "{call ADD_RES_DIR (?, ?, ?, ?)}"; try{ CallableStatement cst = conn.prepareCall(query1); cst.setNull(1, java.sql.Types.NUMERIC); cst.setNull(2, java.sql.Types.NUMERIC); cst.setNull(3, java.sql.Types.NUMERIC); cst.setNull(4, java.sql.Types.NUMERIC); cst.executeQuery(); baseTable.this.showTable (query); } catch (SQLException e1) { e1.printStackTrace(); JOptionPane.showConfirmDialog(null, "Ошибка данных", "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); return;
} break;
}; } public void updrow (int table_id){ //обновляет строку в базе int row_number = table1.getSelectedRow(); if (row_number == -1){ row_number = table1.getEditingRow(); } if (row_number == -1){ return; } String updquery = "Select"; Object [] updrow = new Object [table1.getColumnCount()]; //массив со значениями обновляемых данных switch (table_id) { //выбор таблицы case (1): updquery = "{call UPD_CARD (?, ?, ?, ?, ?, ?, ?)}"; break; case (2): updquery = "{call UPD_TEST (?, ?, ?, ?)}"; break; case (3): updquery = "{call UPD_RES (?, ?, ?, ?, ?)}"; break; } Connection conn = co.conn; try{ CallableStatement cst = conn.prepareCall(updquery); for (int i = 0; i < updrow.length; i++){ updrow[i]=table1.getValueAt(row_number, i); } for (int i = 0; i < updrow.length; i++){ //задание параметров вызова процедуры в базе if (updrow[i]== null){ cst.setNull(i+1,java.sql.Types.VARCHAR ); } else { if ((updrow[i].getClass() == String.class)|| (updrow[i].getClass() == char.class)){ cst.setObject(i+1,updrow[i], java.sql.Types.VARCHAR); } if ((updrow[i].getClass() == BigDecimal.class) || (updrow[i].getClass() == BigInteger.class)){ cst.setObject(i+1,updrow[i], java.sql.Types.NUMERIC); } } } cst.execute(); } catch (SQLException e1) { e1.printStackTrace(); JOptionPane.showConfirmDialog(null, "Ошибка данных", "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); return; } showTable(baseTable.this.query); } public void delrow (int table_id){ //удаляет выбранную строку из таблицы в окне и в базе int row_number = table1.getSelectedRow(); String id = table1.getValueAt(row_number,0).toString(); String delquery = "Select"; switch (table_id) { case (1): delquery = "Delete from cards where card_id = " + id; break; case (2): delquery = "Delete from tests where test_id = " + id; break; case (3): delquery = "Delete from results where res_id = " + id; break; } Connection conn = co.conn; try { Statement st = conn.createStatement(); st.execute(delquery); } catch (SQLException e) { e.printStackTrace(); JOptionPane.showConfirmDialog(null, "Ошибка данных", "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); return; } showTable (baseTable.this.query); } public void showTable (String query){ //заведует отбражением таблицы на экране ResultSet rs; int rowcount =0; int colcount; try { Connection conn = co.conn; PreparedStatement pst = conn.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); rs = pst.executeQuery(); colcount = rs.getMetaData().getColumnCount(); colHeads = new String [colcount]; for (int i=1; i<=colcount; i++){ colHeads[i-1]=rs.getMetaData().getColumnName(i); } while (rs.next()){ rowcount++; } rs.beforeFirst(); data = new Object [rowcount][colcount]; while (rs.next()){ for (int i=1; i<=colcount;i++){ if (rs.getObject(i)==null){ data[rs.getRow()-1][i-1]= null; } else { data[rs.getRow()-1][i-1]=rs.getObject(i); } } }
tm = new tblModel(data, colHeads); TableSorter sorter = new TableSorter(tm,table1.getTableHeader()); table1.setModel(sorter); } catch (SQLException e) { e.printStackTrace(); JOptionPane.showConfirmDialog(null, "Ошибка данных", "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); return; } } public void showFrame (String framename){ JFrame frame = new JFrame (framename); frame.setContentPane(Jpanel1); frame.pack(); frame.setSize(800, 600); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setVisible(true); }
}
|
|