【发布时间】:2011-11-05 15:47:55
【问题描述】:
我正在使用 swing 使用 java(jdk 1.6) 开发桌面应用程序,但刷新视图后出现问题。每当我更新 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--//
}
提前致谢
伊西尔
【问题讨论】:
-
请学习java命名约定并遵守它们
-
您尝试过的任何东西(除了做研究 - 永远不会伤害 :-) 都不需要。相反,您 not 显示的代码有问题,需要 sscce
-
“神奇地”当我设置单元格边框时问题就解决了。 (从 EmptyBorder 更改为 BevelBorder)还有另一个(类似)关于滚动的问题。当我在这张表上滚动时,单元格上的数据也受到了影响并且得到了一个模糊的文本。设置边框后这个问题也解决了。有没有cmets?
-
我应该提供有关其他组件的更多信息还是可以?
标签: swing jtable repaint java-6 jsr296