#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, вы можете попробовать:
- Просто обновите существующую DefaultTableModel с помощью
setDataVector(...)
метода. - Или вы создаете новую DefaultTableModel, а затем обновляете JTable с помощью
setModel(...)
метода.
Комментарии:
1. Не могли бы вы показать мне несколько примеров, я новичок и не понимаю, что вы имеете в виду.
2. Для предложения 2 вы можете прочитать DefaultTableModel API. В нем есть конструктор, в котором вы указываете имена столбцов и данные. Затем, как только вы создаете DefaultTableModel, вы добавляете ее в существующую JTable с помощью метода setModel() . Снова прочитайте API JTable для получения информации об этом методе. Нет необходимости создавать новую таблицу или область прокрутки. Весь код выполняет обновление данных в существующей таблице. Вы всегда можете поискать на форуме примеры, использующие метод setModel().
3. Спасибо за предложение. Я попробую.