#swing #jtable #repaint #java-6 #jsr296
#swing #jtable #перерисовать #java-6 #jsr296
Вопрос:
Я разрабатываю настольное приложение на 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. пожалуйста, изучите соглашения об именовании Java и придерживайтесь их
2. ничего из того, что вы пробовали (кроме проведения исследований — это никогда не повредит :-), никогда не требуется. Вместо этого что-то не так с кодом, который вы не показали, время для sscce
3. «Волшебным образом» проблема решается, когда я устанавливаю границу ячейки. (изменено с EmptyBorder на BevelBorder) Была также другая (похожая) проблема с прокруткой. Когда я прокручивал эту таблицу, данные в ячейках тоже были затронуты и получили размытый текст. Эта проблема также решается после установки границы. Есть комментарии?
4. должен ли я предоставить больше информации о других компонентах или это нормально?
Ответ №1:
У всех таблиц, которые я определил, была одна и та же проблема. После прокрутки все ячейки отображаются как флажок, поле со списком, текстовая область и т.д. стало размытым, пока они не будут нажаты отдельно. Возникла проблема с обновлением. Проблема устраняется, когда связанные TableCellRenderers устанавливают цвет фона ячеек. Это «вероятно» автоматически обновляет ячейки после возникновения проблемы.