powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Динамическое изменение данных модели jTable
14 сообщений из 14, страница 1 из 1
Динамическое изменение данных модели jTable
    #37806999
rasmtp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, поясните пожалуйста такую вещь.
Делаю выборку из БД, данные отправляю в модель для jTable.
Код: 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.
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);
	        }
	         
	         
	    }


После этого хочу создать обработчик для кнопки, который будет делать новый запрос к базе и результаты отправлять в ту же модель.
Делаю так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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 данными выделенной записи):
Код: 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.
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);
	                    }
	                }
	            });


Теперь если в таблице выделена какая-нибудь запись, получаю вот это:
Код: java
1.
2.
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: -1
	    at newapp.NewApp.jButton1ActionPerformed(NewApp.java:201)


Я так думаю, надо ListSelectionListener как-то оповестить, что модель изменилась?
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37807331
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
masterTable.getValueAt(l.getMinSelectionIndex(), 0);
Мб по указанному индексу нет ничего? (я просто не знаю что такое getMinSelectionIndex())

Код: java
1.
2.
rs.next();
fio.setText(rs.getString(1));


Вот это я бы исправил на
Код: java
1.
2.
if(rs.next()) {
fio.setText(rs.getString(1));}



P.S. Закрывайте ресурсы в блоке final ;)
P.S.S. Загружать драйвер достаточно один раз (Class.forName...)
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37807344
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkМб по указанному индексу нет ничего? (я просто не знаю что такое getMinSelectionIndex())

В JTable\JList можно выбрать не одну строку, а диапазон от и до.
Listener так же срабатывает когда выделение вообще снимается со всех строк. Поэтому там может быть -1.
Всё это подробно описано в JavaDoc и Swing tutorial с примерами.
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37807381
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По моему скромному мнению диапазон здесь непричём.
http://docs.oracle.com/javase/6/docs/api/javax/swing/ListSelectionModel.html#getMinSelectionIndex%28%29

int getMinSelectionIndex()
Returns the first selected index or -1 if the selection is empty.
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37807391
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkПо моему скромному мнению диапазон здесь непричём.
Я и не говорил что дело в "диапазоне". Просто объяснил для чего этот метод. Вы же спросили.
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37807420
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczПросто объяснил для чего этот метод. Вы же спросили.
А, спасибо.)
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37810822
rasmtp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое).
Добавил проверку на l.isSelectionEmpty() - заработало).
Код: 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.
lsm.addListSelectionListener(
                new ListSelectionListener() {

                    public void valueChanged(ListSelectionEvent e) {
                        if (e.getValueIsAdjusting()) {
                            return;
                        }
                        ListSelectionModel l = (ListSelectionModel) e.getSource();

                        setComboBoxModel(mediaTypeEditDialog);

                        if (!l.isSelectionEmpty()) {
                            Properties connInfo = new Properties();
                            connInfo.put("user", name);
                            connInfo.put("password", password);
                            connInfo.put("charSet", "Cp1251");
                            try {
                                Connection con = DriverManager.getConnection(url, connInfo);
                                st = con.createStatement();

                                //Установка текстового поля для editDialog

                                String query = "SELECT m.id AS \"id\", m.name AS \"media\", m_type.type AS \"type\""
                                        + " FROM media m, m_type"
                                        + " WHERE (m.m_type_id = m_type.id)"
                                        + " AND m.id = " + masterTable.getValueAt(l.getMinSelectionIndex(), 0);

                                ResultSet rs = st.executeQuery(query);
                                rs.next();
                                mediaEditDialog.setText(rs.getString("media"));
                                mediaTypeEditDialog.setSelectedItem(rs.getString("type"));
                                //Сохраняем текущую строку в списке
                                currentRow.clear();
                                currentRow.add(rs.getInt("id"));
                                currentRow.add(rs.getString("name"));
                                currentRow.add(rs.getString("type"));

                                idRow = (Integer) masterTable.getValueAt(l.getMinSelectionIndex(), 0);

                                rs.close();
                                con.close();
                            } catch (Exception ex) {
                                throw new RuntimeException(ex);
                            }
                        }
                    }
                });
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37810823
rasmtp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S. Закрывайте ресурсы в блоке final ;)

try-catch-finally имеешь в виду?
Подскажи, пожалуйста, как правильно сделать? Где con объявлять, а где rs? В finally и то, и то закрывать?
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37811171
rsltr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasmtp,

вот так наверно:


Код: java
1.
2.
3.
4.
5.
6.
7.
 catch (Exception ex) {
                                throw new RuntimeException(ex);
                            } 
finally {
    		rs.close();
                con.close();
    	}
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37811312
rasmtp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rsltr,

ну я так и подумал, делаю:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Connection con;
                    try {
                        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);
                        if (rs.next()) {
                            fio.setText(rs.getString(1));
                        }
                        rs.close();
                        con.close();
                    } catch (Exception ex) {
                        throw new RuntimeException(ex);
                    }
                    finally {
                        rs.close();
                        con.close();
                    }


говорит, что в блоке finally не знает, чо такое rs. а за пределами try ее тоже объявить нельзя.
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37811418
rsltr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasmtpfinally не знает, чо такое rs. а за пределами try ее тоже объявить нельзя.

не говори чепуху
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37811518
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rasmtpговорит, что в блоке finally не знает, чо такое rs. а за пределами try ее тоже объявить нельзя.
Объявите перед блоком try все ресурсы, которые хотите закрыть.

Код: java
1.
2.
3.
4.
5.
6.
Connection con = null; //ну и все остальные

В блоке finaly
if(con!=null) {
	con.close();}
 //аналогично))



P.S. По-моему в вашем случае нужен PreparedStatement и не закрывать(\открывать) каждый раз Connection..
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37811622
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp.mkПо-моему в вашем случае нужен PreparedStatement и не закрывать(\открывать) каждый раз Connection..
Примерно вот так, посторался упростить свой код на сколько смог (с вашим не смешивал)
Код: 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.
    final static String SQL_PREPARED_STATEMENT = "select rspd.treetext(?) from dual";
    static PreparedStatement preparedStatement;

    private static void updateCurrentTreeCell() throws SQLException {
        if (preparedStatement == null) {
            preparedStatement = DB.getMainConnection().prepareStatement(SQL_PREPARED_STATEMENT);
        }

        int idObt = treeItemModel.id;
        ResultSet queriedData = null;
        try {
            preparedStatement.setInt(1, idObt);
            queriedData = preparedStatement.executeQuery();
            if (queriedData.next()) {
                String s = queriedData.getString(1);
                if (labMarkOpr != null) {
                    labMarkOpr.setText(s);
                }
                treeItemModel.setText(s);
            }
        //catch вам, как и мне, точно не нужен (если, конечно не хотите обработать исключение прям тут)
        } finally {
            if (queriedData != null) {
                if (!queriedData.isClosed()) {
                    queriedData.close();
                }
            }
            //здесь можно позакрывать PreparedStatement, а потом и Connection, но тогда нет смысла в PreparedStatement'е..
        }
    }
...
Рейтинг: 0 / 0
Динамическое изменение данных модели jTable
    #37820730
rasmtp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp.mk,

благодарю за помощь)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Динамическое изменение данных модели jTable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]