Ребят, поясните пожалуйста такую вещь. Делаю выборку из БД, данные отправляю в модель для jTable.
| Код | private static String url = "jdbc:firebirdsql:localhost/3050:d:/bd/mm/mm.fdb"; private static String name = "SYSDBA"; private static String password = "masterkey"; private DatabaseTableModel dbm; JTable masterTable; private ListSelectionModel lsm; private Statement st; public NewApp() { initComponents(); idBegin.setText("1"); idEnd.setText("10"); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { }; String query = "select * from cards"; Properties connInfo = new Properties(); connInfo.put("user", name); connInfo.put("password", password); connInfo.put("charSet", "Cp1251"); try { Class.forName("org.firebirdsql.jdbc.FBDriver"); Connection con = DriverManager.getConnection(url, connInfo); st = con.createStatement(); ResultSet rs = st.executeQuery(query); dbm = new DatabaseTableModel(false); dbm.setDataSource(rs); mainPanel.setLayout(new BorderLayout()); masterTable = new JTable(dbm); lsm = masterTable.getSelectionModel(); lsm.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); mainPanel.add(new JScrollPane(masterTable), BorderLayout.CENTER); rs.close(); con.close(); } catch (Exception ex) { throw new RuntimeException(ex); } }
|
После этого хочу создать обработчик для кнопки, который будет делать новый запрос к базе и результаты отправлять в ту же модель. Делаю так:
| Код | private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { String query = "select * from cards where id >= " + idBegin.getText() + "and id <= " + idEnd.getText(); Properties connInfo = new Properties(); connInfo.put("user", name); connInfo.put("password", password); connInfo.put("charSet", "Cp1251"); try { Class.forName("org.firebirdsql.jdbc.FBDriver"); Connection con = DriverManager.getConnection(url, connInfo); st = con.createStatement(); ResultSet rs = st.executeQuery(query); dbm.setDataSource(rs); rs.close(); con.close(); } catch (Exception ex) { throw new RuntimeException(ex); } }
|
Все работало отлично, пока я не добавил в конструктор вот такой слушатель (для заполнения текстового поля fio данными выделенной записи):
| Код | lsm.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { return; } ListSelectionModel l = (ListSelectionModel) e.getSource(); Properties connInfo = new Properties(); connInfo.put("user", name); connInfo.put("password", password); connInfo.put("charSet", "Cp1251"); try { Class.forName("org.firebirdsql.jdbc.FBDriver"); Connection con = DriverManager.getConnection(url, connInfo); st = con.createStatement(); String query = "select fio from cards where id = " + masterTable.getValueAt(l.getMinSelectionIndex(), 0); ResultSet rs = st.executeQuery(query); rs.next(); fio.setText(rs.getString(1)); rs.close(); con.close(); } catch (Exception ex) { throw new RuntimeException(ex); } } });
|
Теперь если в таблице выделена какая-нибудь запись, получаю вот это:
| Код | Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: -1 at newapp.NewApp.jButton1ActionPerformed(NewApp.java:201)
|
Я так думаю, надо ListSelectionListener как-то оповестить, что модель изменилась? |