我正在Eclipse下使用Java和Swing开展个人项目。
我有一个自定义JTable来渲染单元格。
public class CustomJTable extends JTable{
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
{
Component c = super.prepareRenderer(renderer, row, column);
// change background of rows if [row,13] is even
c.setBackground(getBackground());
if( (int)getModel().getValueAt(row, 13) %2 == 0)
c.setBackground(Color.YELLOW);
// change font, border e background of cells if a string field is equal to some predeterminated value
Font myFont = new Font(TOOL_TIP_TEXT_KEY, Font.ITALIC | Font.BOLD, 12);
c.setForeground(getForeground());
if (getModel().getValueAt(row, column)=="VALUE"){
((JComponent) c).setBorder(new MatteBorder(1, 1, 1, 1, Color.RED)); //needs cast for using setBorder
c.setFont(myFont);
c.setForeground(Color.RED);
c.setBackground(new Color(255, 230, 230));
}
//set disabled cells appearance
if (getModel().getValueAt(row, column)=="DISABLED"){
((JComponent) c).setBorder(new MatteBorder(1, 1, 1, 1, Color.GRAY));
c.setForeground(Color.LIGHT_GRAY);
c.setBackground(Color.LIGHT_GRAY);
}
return c;
}
My CustomJTable从包含带有覆盖方法的类向量的自定义TableModel(extends AbstractTableModel)中获取值。
如果我在向量中添加一个像myModel.getVector().add(element)
这样的元素,我没有问题。
输入myTable.updateUI()
后,Row会自动添加到CustomJtable中,并且它也会正确显示。一切都很完美!!!
当我尝试从之前保存的外部.XML添加行时出现问题。 我添加到JTable中的数据是正确的,黄色行背景也改变了,但是没有渲染单元格(不是单元格边框,不是字体更改,不是RED单元格背景)。
我尝试了一切。 validate()
,repaint()
,fireTableCellChanged()
...
我找不到错误。任何人都可以帮助我吗?
答案 0 :(得分:2)
getModel().getValueAt(row, column)=="VALUE"
>>这很可能已经是一个错误。如果要比较字符串,则需要使用Object.equals
来比较字符串。像这样:"VALUE".equals(getModel().getValueAt(row, column).toString())
。与字符串"DISABLED"
相比,你犯了同样的错误。
第二个错误是您正在使用视图索引在模型中编制索引。 row
方法中传递的column
和JTable.prepareRenderer
参数是视图索引。您不能像在getModel().getValueAt(row, column)
中那样使用它们来索引模型。在调用getModel().getValueAt()
之前,您需要使用JTable.convertRowIndexToModel
和JTable.convertColumnIndexToModel
翻译这些索引。您可以在JTable documentation。
或者,请改用JTable.getValueAt()
。在这里,您可以使用传递给JTable.prepareRenderer
的视图索引。