【发布时间】:2013-01-11 21:29:43
【问题描述】:
我正在尝试创建一个表格并将特定单元格着色为黄色、红色或白色,具体取决于其他列的内容。为此,我正在遍历填充值的行,然后检查内容。这对于当前显示在屏幕上的每一行都可以正常工作,但是当程序到达未显示的行或用户尝试滚动每个单元格时,会将其背景色更改回白色。我在网上搜索了解决方案,唯一听起来合理的想法是在每个循环之后重置 cellRenderer,这不起作用,因为它也会重置每个单元格。
我希望有人知道这个问题的解决方案,或者能给我一个想法,我在哪里迷失了一些东西。
我正在使用这个循环
for(int e = 0; e < modules.size(); e++)
{
gui.clearOutputStream();
gui.getOutputStream().setText("Load Modul " + modules.get(e) + "\r\n");
version = getVersion(modules.get(e));
//Update current Row
updateRow(gui.getReleaseTabelle(), e);
}
调用这个方法
public void updateRow(JTable target, int row){
//...
//insert Values here
//...
CustomRenderer cr = new CustomRenderer();
cr.tab = target;
if(!target.getValueAt(row, 2).equals(target.getValueAt(row, 3)))
{
cr.Val1 = target.getValueAt(row, 1).toString();
target.setValueAt("X", row, 1);
}
else if(!target.getValueAt(row, 7).equals(""))
{
cr.Val1 = target.getValueAt(row, 1).toString();
target.setValueAt("Y", row, 1);
}
else
{
}
target.getColumnModel().getColumn(1).setCellRenderer(cr);
}
这是我的自定义渲染器
class CustomRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = 6703872492730589499L;
public String Val1;
public JTable tab;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if(tab.getValueAt(row, 1).equals("Y")){
cell.setBackground(new java.awt.Color(255, 255, 0));
tab.setValueAt(Val1, row, 1);
}
else if(tab.getValueAt(row, 1).equals("X")){
cell.setBackground(new java.awt.Color(255, 50, 50));
tab.setValueAt(Val1, row, 1);
}
else
{
//do nothing
}
return cell;
}
}
【问题讨论】:
-
为了更好的帮助,请尽快发布SSCCE,简短、可运行、可编译
-
在您的 CustomRenderer 类 tab.setValueAt(Val1, row, 1); 中。为什么需要这个声明?您应该只使用 CustomRenderer 类来渲染颜色。您正在重置 table 中的某些内容。可能这就是问题所在。
-
但是,当程序到达未显示的行或用户尝试滚动每个单元格时,会将其背景色更改回白色。您的某些逻辑错误导致问题。
-
永远不会在渲染器中更改表/模型
-
好吧,在你们告诉我不要从渲染器中更改表格上的任何内容后,我找到了一个解决方案,这迫使我不理会这些值并从渲染器中检查其他列(即table.getValueAt(row, column)) 完全有可能,我还必须将最后一个 else 编辑到 cell.setBackground(new java.awt.Colo(255, 255, 255));而不是什么都不做。所以我最后的假设是正确的,但如果没有你们的 cmets,我永远不会有这个想法。谢谢 Che 和 kleopatra :)
标签: java swing jtable background-color tablecellrenderer