在我的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的相同实例那么这怎么可能呢?
答案 0 :(得分:3)
TableCellRenderer.prepareRenderer
返回的组件会重复用于呈现JTable
的内容 - 在您的情况下,您的渲染器会延伸JLabel
(您可以刚刚扩展DefaultTableCellRenderer
) - 这个JLabel用于绘制JTable
的内容。 prepareRenderer
方法用于在呈现之前为每个单元格自定义JLabel。引用Oracle's tutorial on the JTables
您可能希望表中的每个单元格都是一个组件。但是,出于性能原因,Swing表的实现方式不同。
相反,单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格。您可以将渲染器视为可配置的墨迹标记,该表用于将适当格式化的数据标记到每个单元格上。当用户开始编辑单元格的数据时,单元格编辑器会接管单元格,控制单元格的编辑行为。
答案 1 :(得分:2)
单个渲染器实例为每个单元格创建一个唯一的图像,每个图像根据上面的代码反映该单元格的状态。