" prepareRenderer"当我将数据从xml放入我的customJTable时,它不起作用

时间:2017-05-19 13:03:44

标签: java xml swing jtable windowsbuilder

我正在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() ... 我找不到错误。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

getModel().getValueAt(row, column)=="VALUE">>这很可能已经是一个错误。如果要比较字符串,则需要使用Object.equals来比较字符串。像这样:"VALUE".equals(getModel().getValueAt(row, column).toString())。与字符串"DISABLED"相比,你犯了同样的错误。

第二个错误是您正在使用视图索引在模型中编制索引。 row方法中传递的columnJTable.prepareRenderer参数是视图索引。您不能像在getModel().getValueAt(row, column)中那样使用它们来索引模型。在调用getModel().getValueAt()之前,您需要使用JTable.convertRowIndexToModelJTable.convertColumnIndexToModel翻译这些索引。您可以在JTable documentation

的介绍性说明中阅读更多相关信息

或者,请改用JTable.getValueAt()。在这里,您可以使用传递给JTable.prepareRenderer的视图索引。