Swing 如何刷新JTable模型而不覆盖视图中的旧模型?

Swing 如何刷新JTable模型而不覆盖视图中的旧模型?,swing,jtable,repaint,java-6,jsr296,Swing,Jtable,Repaint,Java 6,Jsr296,我正在用java(JDK1.6)和swing开发一个桌面应用程序,但刷新视图后出现问题。每当我更新JTable的模型时,我都会看到该模型中的数据发生了变化,但视图中出现了问题 它只会用新数据覆盖单元格中的旧数据,并模糊单元格中的数据,就好像它将一张数据图片置于另一张数据图片之上一样。当我双击单元格时,我可以读取新数据。(很遗憾,无法发布图像) 我试过了 要首先将datamodel设置为null,请调用repaint(),然后加载新模型并重新绘制() 调用fireTableDataChanged

我正在用java(JDK1.6)和swing开发一个桌面应用程序,但刷新视图后出现问题。每当我更新JTable的模型时,我都会看到该模型中的数据发生了变化,但视图中出现了问题

它只会用新数据覆盖单元格中的旧数据,并模糊单元格中的数据,就好像它将一张数据图片置于另一张数据图片之上一样。当我双击单元格时,我可以读取新数据。(很遗憾,无法发布图像)

我试过了

  • 要首先将datamodel设置为null,请调用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());
多容器渲染器:

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

我定义的所有表都有相同的问题。 滚动后,所有呈现为复选框、组合框、文本区域等的单元格变得模糊,直到分别单击为止。有一个更新问题。
当相关的TableCellRenders设置单元格的背景颜色时,问题就解决了。这个“可能”会在问题发生后自动更新单元格。

请学习java命名约定并坚持使用它们。您尝试过的任何东西(除了做研究——这永远不会伤害到:-)都不需要。相反,您没有显示的代码有问题,是时候“神奇地”进行sscce了。当我设置单元格边界时,问题就解决了。(从EmptyByOrder改为BevelOrder)关于滚动还有另一个(类似的)问题。当我在这个表格上滚动时,单元格上的数据也受到了影响,得到了一个模糊的文本。设置边界后,这个问题也得到了解决。有什么意见吗?我应该提供更多关于其他组件的信息还是这样可以?