Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое изменение модели для jTable, Динамическое изменение модели для jTable 
:(
    Опции темы
rasmtp
Дата 23.5.2012, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



Ребят, поясните пожалуйста такую вещь. 
Делаю выборку из БД, данные отправляю в модель для 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 как-то оповестить, что модель изменилась?
PM MAIL   Вверх
Zurtax
Дата 11.10.2013, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.10.2006

Репутация: нет
Всего: нет



проще всего DatabaseTableModel сделать наследником от AbstractTableModel и в конце вашего метода setDataSource(rs) вызывать fireTableDataChanged();
PM MAIL   Вверх
cube
Дата 25.1.2014, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 11.4.2007

Репутация: 1
Всего: 3



всю проблему в вашем коде создает masterTable.getValueAt(l.getMinSelectionIndex(), 0) при изменении модели, значение getMinSelectionIndex() станет равно -1.

Добавьте проверку на такую ситуацию в вашем листенере

Код

..............
if (e.getValueIsAdjusting()) {
  return;
}
ListSelectionModel l = (ListSelectionModel) e.getSource();
if(l.getMinSelectionIndex()<0) return;
................



Это сообщение отредактировал(а) cube - 25.1.2014, 01:39
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.