使用自定义TableCellRenderer Swing JTable

时间:2016-08-25 20:05:41

标签: java swing jtable tablecellrenderer

在我的java应用程序中,我想设置颜色以及选择它时的行为。为此我写了一个TableCellRenderer的自定义实现,它正在按我的意愿工作。但是我仍然对此感到困惑......

以下是TableCellRenderer

的实现
public class AccountMovementTableCellRenderer extends JLabel implements TableCellRenderer{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean  isSelected, boolean hasFocus, int row, int column){     
        //My implementation here...
        return this;
    }
}

这里创建了JTable

AccountMovementTableCellRenderer accountMovementCellRenderer = new AccountMovementTableCellRenderer();
entryTable = new JTable(entryModel){
    private static final long serialVersionUID = 1L;

    @Override
    public TableCellRenderer getCellRenderer(int row, int column){
        return accountMovementCellRenderer;
    }
};

我只创建了一个CellRenderer的实例,但我期待每个单元格有一个CellRenderer,我很惊讶它正在以这种方式工作......内容和颜色适用于每个单元格不同但它始终使用CellRenderer的相同实例那么这怎么可能呢?

2 个答案:

答案 0 :(得分:3)

TableCellRenderer.prepareRenderer返回的组件会重复用于呈现JTable的内容 - 在您的情况下,您的渲染器会延伸JLabel(您可以刚刚扩展DefaultTableCellRenderer) - 这个JLabel用于绘制JTable的内容。 prepareRenderer方法用于在呈现之前为每个单元格自定义JLabel。引用Oracle's tutorial on the JTables

  

您可能希望表中的每个单元格都是一个组件。但是,出于性能原因,Swing表的实现方式不同。

     

相反,单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格。您可以将渲染器视为可配置的墨迹标记,该表用于将适当格式化的数据标记到每个单元格上。当用户开始编辑单元格的数据时,单元格编辑器会接管单元格,控制单元格的编辑行为。

答案 1 :(得分:2)

单个渲染器实例为每个单元格创建一个唯一的图像,每个图像根据上面的代码反映该单元格的状态。