TableModelListener не всегда работает

Я разрабатываю приложение с использованием java swing, в котором есть jTable, который я импортировал данные из базы данных. Я хочу обновить свою базу данных напрямую из jTable. Итак, на основе кода, который я нашел (извините, я не помню ссылка) мне удалось сделать это с помощью TableModelListener, но я обнаружил небольшую проблему, я могу использовать TableModelListener только в том случае, если я больше ничего не использую, например, у меня есть кнопка, которая делает что-нибудь, если я нажму на эту кнопку, я вернусь, чтобы обновить любой ячейка в таблице ничего не происходит, это похоже на то, что TableModelListener был деактивирован. если я сначала обновлю таблицу, она работает отлично, но если я обновлю ее после того, как сделаю что-нибудь еще, она не будет работать вот часть моего кода (мой код слишком длинный) я пытался решить эту проблему, но не смог

    public home() {

            initComponents();


            connection();

            jTable.getModel().addTableModelListener(new TableModelListener() {
                @Override
                public void tableChanged(TableModelEvent e) {
                    modiftable(e);
                }

            });


            if (jTable.getCellEditor()!=null)
            {
            jTable.getCellEditor().stopCellEditing();
            }


        }


 private void modiftable(TableModelEvent e) {
        if (e.getType() == TableModelEvent.UPDATE) {
            connection();
            home.model = (DefaultTableModel) ((TableModel) (e.getSource()));
            int fila = e.getFirstRow();
            int col = e.getColumn();
            String data = String.valueOf(home.model.getValueAt(jTable.getSelectedRow(), jTable.getSelectedColumn()));
            String rqt = "";
            String rqt2 = "";
            if (col == 1) {
                String nom = String.valueOf(home.model.getValueAt(jTable.getSelectedRow(), 0));
                String poste = String.valueOf(home.model.getValueAt(jTable.getSelectedRow(), 3));
                String rqqq = "SELECT `CIE/SFIN`,`SFIN OU CIE` FROM `allin` WHERE `Nom produit`='" + nom + "' and `poste`='" + poste + "'";

                String pos = "";
                String old = "";
                ResultSet rt = selection(rqqq);
                try {
                    while (rt.next()) {
                        old = rt.getString(1);
                        pos = rt.getString(2);
                        System.out.println(pos);
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(home.class.getName()).log(Level.SEVERE, null, ex);
                }
                if (pos.equals("CIE")) {
                    rqt = "UPDATE `cie` SET `CIE`='" + data + "' WHERE `CIE`='" + old + "'";
                    rqt2 = "UPDATE `produit` SET `CIE`='" + data + "' WHERE `CIE`='" + old + "'";
                    System.out.println(rqt);
                } else if (pos.equals("SFIN")) {
                    rqt = "UPDATE `sfin`  SET `SFIN`='" + data + "' WHERE `SFIN`='" + old + "'";
                    rqt2 = "UPDATE `produit` SET `SFIN`='" + data + "' WHERE `SFIN`='" + old + "'";

                    System.out.println(rqt);
                }
                DataBase db = new DataBase();
                java.sql.PreparedStatement psm;
                java.sql.PreparedStatement psm2;

                try {
                    psm = db.con.prepareStatement(rqt);
                    psm.executeUpdate(rqt);
                    psm2 = db.con.prepareStatement(rqt2);
                    psm2.executeUpdate(rqt2);

                } catch (SQLException ex) {
                    Logger.getLogger(home.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }

    }

Прежде всего попробуйте отладить свое приложение и определить, есть ли у вас проблемы с Swing или с SQL. Затем предоставьте минимальный воспроизводимый пример, чтобы мы также смогли воспроизвести вашу проблему. Если у вас есть проблема с Swing, вам нужно создать пример без доступа к базе данных. Если у вас есть проблема с SQL - создайте еще один пост без Swing, но с проблемным оператором SQL (включая оператор создания для вашей таблицы SQL).

Sergiy Medvynskyy 08.08.2018 14:34

У меня нет проблем с sql или Swing, они работают нормально, даже этот код работает нормально, но не всегда, как я объяснил, если я нажимаю на что-либо, слушатель модели таблицы больше не будет работать

Ela Hidri 08.08.2018 15:01

это происходит каждый раз, когда я вызываю .setmodel

Ela Hidri 08.08.2018 15:34

Когда вы вызываете JTable.setModel(TableModel), вам нужно снова зарегистрировать свой слушатель (если новая модель не такая, как старая).

Sergiy Medvynskyy 08.08.2018 15:40
"у меня нет проблем с sql или свингом" У вас проблемы, если никто не помогает? MCVE, предложенный @SergiyMedvynskyy, - отличный способ побудить людей помочь. Жестко закодируйте некоторые данные для замены БД. (Кстати, я только что добавил второе закрытое голосование, основанное на отказе от MCVE.)
Andrew Thompson 08.08.2018 15:40

Да, и ... Используйте логичную и последовательную форму отступов строк и блоков кода. Отступы предназначены для облегчения выполнения кода!

Andrew Thompson 08.08.2018 15:41

спасибо всем, вы видите, что я ответил на свою проблему, я нашел решение каждый раз, когда я вызываю jtable.setModel, я удаляю tableModelListener, затем я вызываю его

Ela Hidri 08.08.2018 15:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
103
1

Ответы 1

поэтому я нашел решение своей проблемы ... каждый раз, когда я вызываю jTable.setModel, tableModelListener не будет работать, поэтому я сделал следующее: каждый раз, когда я вызываю jtable.setModel, я удаляю tableModelListener, а затем снова вызываю его следующим образом:

            jTable.setModel(model);

            jTable.getModel().removeTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                modiftable(e);
            }

        });
            jTable.getModel().addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                modiftable(e);
            }

        });


        if (jTable.getCellEditor()!=null)
        {
        jTable.getCellEditor().stopCellEditing();
        }

Другие вопросы по теме