Новая строка данных в таблице в jscrollpane не прокручивается?

#java #jtable #jpanel #jscrollpane

#java #jtable #jpanel #jscrollpane

Вопрос:

Я использую следующий код для отображения статистики в таблице. Каждый раз, когда данные в hashmap изменяются, я снова запускаю следующий код. Хотя недавно добавленная строка будет отображаться, она не может прокручиваться (например, таквведите описание изображения здесь). Итак, кто-нибудь знает, почему? Спасибо.

  HashMap<String, Commodity> duMap = Light.getLightMap();

            String[] column = {"Name", "Type", "Amount", "Default in price", "Default out price", "Last in price", "Last out price"};
            String[][] row = new String[duMap.size()][];
            int i = 0;
            for (String string : duMap.keySet()) {
                duLight = duMap.get(string);
                row[i] = new String[]{duLight.getName(), duLight.getModel(), "" duLight.getAmount(), "" duLight.getDefaultIP(), "" duLight.getDefaultOP(), "" duLight.getLastIP(), "" duLight.getLastOP()};
                i   ;
            }
            JTable statistics = new JTable(row, column);
            statistics.setEnabled(false);
            statistics.setFont(new Font("DIALOG", 2, 20));
            for (int j = 0; j < 7; j  ) {
                statistics.getColumnModel().getColumn(j).setPreferredWidth(120);
            }
            statistics.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            statistics.setRowHeight(40);

            statistics.setDefaultRenderer(Object.class, dtc);

            //back is a static panel
            back.add(new JScrollpane(statistics), BorderLayout.CENTER);
            back.revalidate();
  

Комментарии:

1. Похоже, что вы не удаляете старую область прокрутки / таблицу, сказав это, ваш подход невероятно неэффективен. Лучшим решением было бы разработать TableModel, которая могла бы обернуть вашу HashMap, а затем предоставить простой метод (в табличной модели), чтобы сообщить, когда были добавлены новые строки, и позволить ему запускать обновление

2. @MadProgrammer Есть примеры? Я новичок в этом.

Ответ №1:

Вместо того, чтобы постоянно создавать новую JTable и JScrollPane, вы можете попробовать:

  1. Просто обновите существующую DefaultTableModel с помощью setDataVector(...) метода.
  2. Или вы создаете новую DefaultTableModel, а затем обновляете JTable с помощью setModel(...) метода.

Комментарии:

1. Не могли бы вы показать мне несколько примеров, я новичок и не понимаю, что вы имеете в виду.

2. Для предложения 2 вы можете прочитать DefaultTableModel API. В нем есть конструктор, в котором вы указываете имена столбцов и данные. Затем, как только вы создаете DefaultTableModel, вы добавляете ее в существующую JTable с помощью метода setModel() . Снова прочитайте API JTable для получения информации об этом методе. Нет необходимости создавать новую таблицу или область прокрутки. Весь код выполняет обновление данных в существующей таблице. Вы всегда можете поискать на форуме примеры, использующие метод setModel().

3. Спасибо за предложение. Я попробую.