您好我有一个JTable并且我希望灰色显示我尝试使用自定义渲染器检查isEnabled()然后更改背景颜色但仍然无法工作的所有禁用复选框单元格。 有什么建议? 感谢!!!
答案 0 :(得分:14)
如Concepts: Editors and Renderers所述,“单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格。”您需要在table model中保持enabled
州。
附录:作为一个具体示例,此example中的数据模型是Date
个实例的简单数组。如下所示覆盖getTableCellRendererComponent()
会导致奇数天被禁用。在这种情况下,奇数是Date
值本身固有的属性,但可以查询任何相关属性的模型。
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int col) {
Calendar calendar = Calendar.getInstance();
calendar.setTime((Date) value);
Component c = super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, col);
c.setEnabled(calendar.get(Calendar.DAY_OF_MONTH) % 2 == 0);
return c;
}
附录:在上面的示例中,DateRenderer
被引发,因为TableModel
会返回type token Date.class
,因为它已成为默认值。
table.setDefaultRenderer(Date.class, new DateRenderer());
可以通过覆盖prepareRenderer()
获得相同的外观,如下所示,但不管是哪个类,都会为所有单元调用该方法。因此,prepareRenderer()
非常适合影响整行,如Table Row Rendering。
private final JTable table = new JTable(model) {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
Component c = super.prepareRenderer(renderer, row, col);
if (col == DATE_COL) {
Calendar calendar = Calendar.getInstance();
calendar.setTime((Date) model.getValueAt(row, col));
c.setEnabled(calendar.get(Calendar.DAY_OF_MONTH) % 2 == 0);
}
return c;
}
};