Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Динамическое изменение данных модели jTable / 14 сообщений из 14, страница 1 из 1
23.05.2012, 05:17:58
    #37806999
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
Ребят, поясните пожалуйста такую вещь.
Делаю выборку из БД, данные отправляю в модель для 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
23.05.2012, 10:58:34
    #37807331
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
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
23.05.2012, 11:02:48
    #37807344
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
avp.mkМб по указанному индексу нет ничего? (я просто не знаю что такое getMinSelectionIndex())

В JTable\JList можно выбрать не одну строку, а диапазон от и до.
Listener так же срабатывает когда выделение вообще снимается со всех строк. Поэтому там может быть -1.
Всё это подробно описано в JavaDoc и Swing tutorial с примерами.
...
Рейтинг: 0 / 0
23.05.2012, 11:23:40
    #37807381
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
По моему скромному мнению диапазон здесь непричём.
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
23.05.2012, 11:31:54
    #37807391
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
avp.mkПо моему скромному мнению диапазон здесь непричём.
Я и не говорил что дело в "диапазоне". Просто объяснил для чего этот метод. Вы же спросили.
...
Рейтинг: 0 / 0
23.05.2012, 11:40:22
    #37807420
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
BlazkowiczПросто объяснил для чего этот метод. Вы же спросили.
А, спасибо.)
...
Рейтинг: 0 / 0
25.05.2012, 06:13:33
    #37810822
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
Спасибо большое).
Добавил проверку на 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
25.05.2012, 06:19:12
    #37810823
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
P.S. Закрывайте ресурсы в блоке final ;)

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

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


Код: java
1.
2.
3.
4.
5.
6.
7.
 catch (Exception ex) {
                                throw new RuntimeException(ex);
                            } 
finally {
    		rs.close();
                con.close();
    	}
...
Рейтинг: 0 / 0
25.05.2012, 12:18:42
    #37811312
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
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
25.05.2012, 13:05:37
    #37811418
rsltr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
rasmtpfinally не знает, чо такое rs. а за пределами try ее тоже объявить нельзя.

не говори чепуху
...
Рейтинг: 0 / 0
25.05.2012, 13:39:04
    #37811518
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
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
25.05.2012, 14:17:01
    #37811622
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
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
01.06.2012, 05:17:21
    #37820730
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое изменение данных модели jTable
avp.mk,

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


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