Swing 如何刷新JTable模型而不覆盖视图中的旧模型?
我正在用java(JDK1.6)和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
- 要首先将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)关于滚动还有另一个(类似的)问题。当我在这个表格上滚动时,单元格上的数据也受到了影响,得到了一个模糊的文本。设置边界后,这个问题也得到了解决。有什么意见吗?我应该提供更多关于其他组件的信息还是这样可以?