【发布时间】:2019-12-02 02:11:56
【问题描述】:
好吧,这让我难过了几天。也许标题不够准确,但这是我能想到的唯一描述我的情况的东西。
我对用户的最终目标是,当他们编辑一行时,仅在第 4 列或第 5 列中,表格将突出显示(设置背景颜色为黄色)数据与第 4 列编辑行中的值匹配的任何行,并且5 分别为实际编辑行除外。 (这两列都是jcomboboxes)
听起来不错?好吧,我也试图保持这些行突出显示,而当用户在第 4 列或第 5 列中编辑具有与以前不同的值的另一行时,仍然重复并突出显示匹配的行,而不是重新渲染先前突出显示的行。事实证明这对我来说非常困难,因为我不太明白发生了什么。
最终,当我弄清楚这一点时,用户只需选择行即可从行中删除颜色(表示他们已经检查了该数据)。
我需要知道如何在 jtable 中调用渲染器。似乎每次进行更改时都会调用它。有没有办法渲染表格,然后绕过对渲染器的调用,这样它就不必不断地重新绘制单元格?我不知道我是否在问正确的问题。
我正在尝试覆盖 getTableCellRendererComponent 方法并以这种方式返回颜色,但是当我编辑不同的单元格时,我会丢失第一次编辑时突出显示的内容。并且突出显示的内容也不是完全正确的,它获取了大部分匹配数据以及其他不匹配的行。我不完全理解我猜的渲染器
必须有一个我没有掌握的概念。或者也许有一种完全不同的方式来做到这一点。我可以朝正确的方向推动!
public class ColorChange extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (column != 7) {
this.setHorizontalAlignment(SwingConstants.CENTER);
}
else {
this.setHorizontalAlignment(SwingConstants.LEFT);
}
Color curColor = c.getBackground();
if (ColorCheck(table, row, column)) {
c.setBackground(Color.YELLOW);
}
else if (curColor == Color.YELLOW) {
c.setBackground(curColor);
}
else {
c.setBackground(Color.WHITE);
}
return c;
}
}
public boolean ColorCheck(JTable jt, int row, int col) {
boolean result = false;
int er = jt.getEditingRow();
int ec = jt.getEditingColumn();
if (er<0 || ec<0) {
return result;
}
String edMainCat = (String) jt.getValueAt(er, 4);
String edSubCat = (String) jt.getValueAt(er, 5);
String MainC = (String) jt.getValueAt(row, 4);
String SubC = (String) jt.getValueAt(row, 5);
if (edMainCat == null || edSubCat == null || MainC == null || SubC == null || row == er) {
return result;
}
if (edMainCat.equals(MainC) && edSubCat.equals(SubC)) {
result = true;
}
return result;
}
【问题讨论】:
-
代码片段,您已在此处发布,没有提示我们您的问题。当您想在这里获得帮助时,请提供minimal reproducible example(带有 main 方法的小类,仅导入标准 java 类/包,并且可以由 StackOverflow 社区的其他成员运行),重现您的错误行为的步骤以及你想得到什么。
-
顺便说一句:关于表格单元格渲染器的颜色问题,建议在调用超级实现之前将背景设置为
null(插入行setBackground(null);作为方法@987654326的第一行@)。如果此提示不能解决您的问题,请按照我上面的要求提供minimal reproducible example。 -
这不应该很难正常工作——让表格单元格渲染器正常工作有时是一件很棘手的事情,但并非不可能。请帮助我们通过提供上面要求的最小可重现示例来帮助您,这样人们就可以将其放入 Eclipse 或 Netbeans 并快速运行,而无需编写其余代码。
-
好的,我今天晚些时候再做。
标签: java swing jtable jcombobox tablecellrenderer