0

我正在 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;
}

我的 CustomJTable 从自定义 TableModel(扩展 AbstractTableModel)中获取值,该自定义 TableModel 包含一个具有重写方法的类向量。

如果我在向量中添加一个类似这样的元素,myModel.getVector().add(element)我没有问题。在我输入之后myTable.updateUI(),Row 会自动添加到 CustomJtable 中,并且它也是正确的并且也被渲染了。一切都很完美!!!

当我尝试从之前保存的外部 .XML 添加行时,就会出现问题。我添加到 JTable 中的数据是正确的,黄色行背景也发生了变化,但未呈现单元格(不是单元格边框,不是字体更改,不是红色单元格背景)。

我什么都试过了。validate(), repaint(), fireTableCellChanged()...我找不到错误。谁能帮我?

4

1 回答 1

2

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

第二个错误是您使用视图索引在模型中建立索引。方法中传递的row和参数是视图索引。您不能像在. 您需要在调用之前使用and翻译这些索引。您可以在JTable 文档的介绍性描述中阅读更多相关信息。columnJTable.prepareRenderergetModel().getValueAt(row, column)JTable.convertRowIndexToModelJTable.convertColumnIndexToModelgetModel().getValueAt()

或者,JTable.getValueAt()改为使用。在这里,您可以使用传递给JTable.prepareRenderer.

于 2017-05-19T13:44:36.810 回答