Как обновить JTable Model, не перезаписывая старую модель в представлении? - PullRequest
0 голосов
/ 05 ноября 2011

Я разрабатываю настольное приложение на 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--//
}

Заранее спасибо

Исиль

1 Ответ

0 голосов
/ 09 января 2012

Все таблицы, которые я определил, имели ту же проблему. После прокрутки все ячейки, отображаемые как флажки, выпадающие списки, текстовые области и т. Д., Расплывались до тех пор, пока они не щелкались отдельно. Возникла проблема с обновлением. Проблема решается, когда связанные TableCellRenderers устанавливают цвет фона ячеек. Это «вероятно» обновляет ячейки автоматически после возникновения проблемы.

...