Как обновить JTable Model, не перезаписывая старую модель в представлении?
Я разрабатываю настольное приложение на Java(JDK 1.6) с Swing, но у меня возникли проблемы после обновления представления. Всякий раз, когда я обновляю модель JTable, я вижу, что данные в этой модели изменяются, но возникает проблема в представлении.
Он только перезаписывает старые данные в ячейках новыми данными и размывает данные в ячейках, как если бы он помещал одно изображение данных поверх другого. Когда я дважды щелкаю по ячейкам, я могу прочитать новые данные. (не могу опубликовать изображение, к сожалению)
Я старался
- чтобы установить datamodel сначала в null, вызовите repaint(), затем загрузите новую модель и repaint()
- вызвать fireTableDataChanged()
- искать похожие проблемы и вопросы
Ничего не сработало. У меня есть много таких таблиц, но только эта таблица имеет такую проблему.
Чтобы обновить базовую модель данных:
void loadTask(Task t) {
(....)
TaskPropertiesModel = new DefaultTableModel();
Object[][] data = new Object[][]
{
{"Start :", t.getStart()},
{"End :", t.getEnd()},
{"Freq. :", t.getFrequency()},
{"Roles :", roles},
{"Hard :", t.getHard()},
{"Values:", values}
};
TaskPropertiesModel.setDataVector(data, new Object[2]); //no column is shown
}
Свойства таблицы:
TaskPropertiesTable.setMaximumSize(new java.awt.Dimension(150, 90));
TaskPropertiesTable.setMinimumSize(new java.awt.Dimension(150, 90));
TaskPropertiesTable.setRowSelectionAllowed(false);
TaskPropertiesTable.getTableHeader().setResizingAllowed(false);
TaskPropertiesTable.getTableHeader().setReorderingAllowed(false);
TaskPropertiesTable.setTableHeader(null);
TaskPropertiesTable.setPreferredScrollableViewportSize(TaskPropertiesTable.getPreferredSize());
TaskPropertiesTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [6][2],new String [2] ));
TaskPropertiesTable.setDefaultRenderer(Object.class, new MultiLineCellRenderer());
MultiLineCellRenderer:
public class MultiLineCellRenderer extends JTextArea implements TableCellRenderer {
public MultiLineCellRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
setOpaque(true);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(Color.BLACK);
setBackground(Color.LIGHT_GRAY);
}
else {
setForeground(Color.BLACK);
setBackground(Color.WHITE);
}
setFont(table.getFont());
if (hasFocus) {
setBorder(new FocusBorder(Color.RED, Color.RED));
if (table.isCellEditable(row, column)) {
setForeground(Color.BLACK);
setBackground(Color.LIGHT_GRAY);
}
} else {
setBorder(new BevelBorder(1)); // This was emptyBorder.
//after changing it, the problem is solved
}
if (!table.isCellEditable(row, column)) {
setForeground(Color.BLACK);
setBackground(Color.LIGHT_GRAY);
}
setText((value == null) ? "" : value.toString());
//---setting the row height--//
}
заранее спасибо
Isil
1 ответ
У всех таблиц, которые я определил, была та же самая проблема. После прокрутки все ячейки, отображаемые как флажки, выпадающие списки, текстовые области и т. Д., Расплывались до тех пор, пока они не щелкались отдельно. Возникла проблема с обновлением. Проблема решается, когда связанные TableCellRenderers устанавливают цвет фона ячеек. Это "вероятно" обновляет ячейки автоматически после возникновения проблемы.