尝试使用自定义渲染器为 JTable 的特定行着色,而不是我所有的行都被着色
Trying to color specific rows of JTable using Custom Renderer, instead all my rows are colored
对于我的 Java 程序,基本上当我的 JTable 的第 4 列中的值大于第 3 列时,我希望那些特定的行被着色为红色,而不是其他行。
我已经实现了以下代码,但由于某种原因,我的所有行都变成了红色,而不仅仅是符合条件的行。
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int col) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
int Value1= Integer.parseInt(table.getModel().getValueAt(row, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(row, 4).toString());
if (Value2>=Value1) {
setBackground(Color.red);
}
return this;
}
});
任何 suggestions/tips 如何解决这个问题?
A DefaultTableCellRenderer
实例使用模板组件来呈现所有单元格(即它本身,请参阅文档)。设置颜色后,模板将具有该颜色并将应用于所有后续单元格。
你需要做的是在你的逻辑中,在你需要的情况下将颜色设置为红色,在所有其他情况下将其设置为默认背景颜色。
if(!isSelected) {
if (Value2>=Value1) {
setBackground(Color.red);
} else {
setBackground(table.getBackground()); // or use another color for another background
}
}
再次查看您的代码,我注意到您在模型与视图索引方面存在错误。使用视图索引调用 getTableCellRendererComponent
方法,但您正在使用这些索引模型(例如在 table.getModel().getValueAt(row, 3)
中)。当您的 table 被排序时,结果将不正确,因为模型索引和视图索引将不同。
如果需要从模型中获取值,首先需要将视图索引转换为模型索引。使用 JTable.convertRowIndexToModel
and JTable.convertColumnIndexToModel
来做到这一点。例如:
int modelRowId = table.convertRowIndexToModel(row);
int Value1= Integer.parseInt(table.getModel().getValueAt(modelRowId, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(modelRowId, 4).toString());
看看 Table Row Rendering,它展示了如何通过覆盖 JTable 的 prepareRenderer(...)
方法来实现这一点。
使用这种方法,您不需要为 table 中的每种数据类型自定义渲染器。
对于我的 Java 程序,基本上当我的 JTable 的第 4 列中的值大于第 3 列时,我希望那些特定的行被着色为红色,而不是其他行。
我已经实现了以下代码,但由于某种原因,我的所有行都变成了红色,而不仅仅是符合条件的行。
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int col) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
int Value1= Integer.parseInt(table.getModel().getValueAt(row, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(row, 4).toString());
if (Value2>=Value1) {
setBackground(Color.red);
}
return this;
}
});
任何 suggestions/tips 如何解决这个问题?
A DefaultTableCellRenderer
实例使用模板组件来呈现所有单元格(即它本身,请参阅文档)。设置颜色后,模板将具有该颜色并将应用于所有后续单元格。
你需要做的是在你的逻辑中,在你需要的情况下将颜色设置为红色,在所有其他情况下将其设置为默认背景颜色。
if(!isSelected) {
if (Value2>=Value1) {
setBackground(Color.red);
} else {
setBackground(table.getBackground()); // or use another color for another background
}
}
再次查看您的代码,我注意到您在模型与视图索引方面存在错误。使用视图索引调用 getTableCellRendererComponent
方法,但您正在使用这些索引模型(例如在 table.getModel().getValueAt(row, 3)
中)。当您的 table 被排序时,结果将不正确,因为模型索引和视图索引将不同。
如果需要从模型中获取值,首先需要将视图索引转换为模型索引。使用 JTable.convertRowIndexToModel
and JTable.convertColumnIndexToModel
来做到这一点。例如:
int modelRowId = table.convertRowIndexToModel(row);
int Value1= Integer.parseInt(table.getModel().getValueAt(modelRowId, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(modelRowId, 4).toString());
看看 Table Row Rendering,它展示了如何通过覆盖 JTable 的 prepareRenderer(...)
方法来实现这一点。
使用这种方法,您不需要为 table 中的每种数据类型自定义渲染器。