Воспроизведение JTable при обновлении содержимого

У меня есть приложение, в котором используется JTable. когда я добавляю что-то в базу данных, он входит в базу данных, но я не могу каким-то образом воссоздать JTable .. Я попытался перерисовать (); метод, который создает мою таблицу, я попробовал Revalidate (); но и без успеха

Я даже пытался вспомнить метод, но и это не помогло.

Действующее действие выглядит следующим образом:

    @Override
public void actionPerformed(ActionEvent e) {

    if(e.getSource() == add) {
        model.insertValue(toDo.getText());
        model.getValue();
        view.createTable();
        toDo.setText("");
    }
}

и метод, который создает JTable

    public void createTable() {

    JTable table = new JTable();

    DefaultTableModel tableModel = new DefaultTableModel(new Object[][]{},new String[]{"To do","Date added", "Modify"});

    table.setSize(450, 600);


    table.setModel(tableModel);
    JScrollPane scrlPan=new JScrollPane(table);

    for(int i = 0; i < model.getId().size(); i++) {

        tableModel.addRow(new Object[]{
                model.getItem().get(i), 
                model.getDate().get(i), 
                model.getId().get(i)
                });
    }

    add(scrlPan);
    add(table.getTableHeader(), BorderLayout.NORTH);
    add(table, BorderLayout.CENTER);
}

любые идеи о том, как это решить?

0
nl ja de
1) Создайте таблицу при запуске и при необходимости настройте модель . 2) Чтобы лучше помочь, опубликуйте SSCCE .
добавлено автор Andrew Thompson, источник
Добавление тегов не стоит денег и помогает классифицировать просмотр и поиск, поэтому, пожалуйста, попробуйте выбрать более 1.
добавлено автор Andrew Thompson, источник

3 ответы

Создайте поле tableModel класса и обновите его, когда вам нужно. Не воссоздавайте объект table .

1
добавлено
@Reshad попробуйте tableModel.fireTableDataChanged() после смены модели. Также посмотрите на это: stackoverflow.com/questions/3179136/…
добавлено автор Andremoniy, источник
@kleopatra, почему?
добавлено автор Andremoniy, источник
Хорошо, если так, я удалю неправильное изменение. благодаря
добавлено автор Andremoniy, источник
@kleopatra, почему вы сказали "никогда не называть какой-либо из методов fireXX кодом, внешним по отношению к модели" ? Как вы можете это объяснить? Кроме того, я предоставил ссылку на вопрос и ответ на его рейтинг. Вы будете спорить с этими экспертами?
добавлено автор Andremoniy, источник
Я пробовал это, но не работал. Я думаю, что я сделал это неправильно. не могли бы вы привести мне пример?
добавлено автор Reshad, источник
OP использует DefaultTableModel , поэтому нет необходимости явно вызывать метод fireXX . DefaultTableModel сам делает это, когда когда-либо происходит изменение данных таблицы. AFAIK, что бы вы делали на данных таблицы, это должно быть сделано на tableModel . Поэтому ваша модель таблицы должна вызывать методы fireXX , когда она обновляется. Я думаю, что именно поэтому kleopatra сказал это.
добавлено автор Amarnath, источник
хм ... зачем что?
добавлено автор kleopatra, источник
нет, никогда не вызывайте ни один из методов fireXX из внешнего кода модели - это model , чтобы уведомить своих слушателей об изменении
добавлено автор kleopatra, источник
  • don't reinvent the wheel, search for ResultSetTableModel (few code workarounds) or TableFromDatabase made by @camickr

  • a.m. workaround are EDT sensitive, JTables contents waiting until ResultSet returns all rows, Swing GUI freeze or isn't responsible for Key & Mouse events until long and hard Object (JDBC) is done, this logics could be suitable for small ResultSets from small DB tables, wihtout opening & closing Connection to Database, otherwise have to use SwingWorker and Batch logics (f.e. update XxxTableModel with 20rows)

1
добавлено

Следующий код, полученный непосредственно от вашего, работает для меня без проблем:

    JTable table = new JTable();
    final DefaultTableModel model = new DefaultTableModel(
            new Object[][] {}, new String[] { "To do", "Date added",
                    "Modify" });
    table.setModel(model);

    JFrame f = new JFrame();
    f.getContentPane().add(table);

    JButton b = new JButton("More ..");
    f.getContentPane().add(b, BorderLayout.NORTH);
    b.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < 2; i++) {
                model.addRow(new Object[] { "A" + i, "B" + i, "C" + i });
            }
        }
    });
    f.setSize(400, 400);
    f.setVisible(true);
    b.doClick();

Просто проверьте, что вы делаете по-другому. Последнее, что я могу заподозрить, - возможно, вы устанавливаете новые значения непосредственно из потока без Swing. Используйте SwingUtilities.invokeLater для установки значений.

Модели, полученные из AbstractTableModel, должны вызывать унаследованный метод fireTableCellUpdated в вашей модели. Есть также больше триггеров для запуска слушателей смены контента, которые JTable регистрирует, чтобы он мог обновляться при изменении модели. Используйте это для вашего дела. Альтернативный способ, который может быть хорош для полного изменения контента, заключается в создании и настройке всего нового TableModel. Но в вашем случае это может быть нецелесообразно, поскольку вы используете DefaultTableModel: он уже реализовал эту функциональность, ему не нужны repaint (), revalidate (), fireTableXYZ. Он должен делать все сам, как только вы установите новый контент.

1
добавлено
хм, так что в принципе я не должен ничего делать? (это не работает ни btw)
добавлено автор Reshad, источник
вот что я сделал, я создал эту защищенную таблицу DefaultTableModel tableModel; и я называю это view.tableModel.fireTableStructureChanged (); в моем actionPerformed, но все равно никаких изменений.
добавлено автор Reshad, источник
@ AudriusMeškauskas ах ждать, я неправильно понял .. мой плохой! но что мне делать с параметрами, которые мне нужно передать в myModel.fireTableCellUpdate() ;? потому что он не может быть пустым: S, что предлагает затмение, - использовать fireTableChanged (); который не требует параметров, но при использовании ничего не происходит.
добавлено автор Reshad, источник
На какой части моей модели следует использовать функцию fireTableCellUpdated? потому что моя модель ничего не знает о JTable, все это на мой взгляд. Модель знает только об обработке базы данных и нажатии на представление.
добавлено автор Reshad, источник
@Reshad никогда не вызывать fireTableXxx для DefaultTableModel, этот уведомитель реализован и правильно
добавлено автор mKorbel, источник
Ваша модель достаточно знает о своей таблице, поскольку она получена из AbstractTableModel и имеет унаследованный код. Самое главное, он наследует addTableModelListener, который вызывается JTable, когда вы устанавливаете для него модель. Просто позвоните по своей модели: myModel.fireTableCellUpdated (); ,
добавлено автор h22, источник
Если вы не знаете, где и что изменилось, или, может быть, все изменилось, может быть проще воссоздать и установить всю новую модель.
добавлено автор h22, источник
Хм ... если вы хотите вызвать fireXX из кода вне таблицыModel - это не-нет: это сама модель, чтобы уведомить своих слушателей. Выполнение внутри пользовательской реализации tableModel - это путь :-)
добавлено автор kleopatra, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async