Как обновить модель JTable без перезаписи старой модели в представлении?

#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 устанавливают цвет фона ячеек. Это «вероятно» автоматически обновляет ячейки после возникновения проблемы.