仅对 JTable 中的特定单元格着色
Color only specific cells in JTable
我正在寻找这个问题的解决方案:
我有一个 excel 文件,其中包含数据。一些单元格具有黄色背景。我已经创建了一个用于将文本导入 JTable 的代码,它工作正常。但我也想将背景单元格颜色导入特定单元格。为了这个例子的简单起见,我没有使用循环,从源等读取 excel 数据。阅读论坛后我明白我需要 CustomCellRenderer。
我对这种方法有疑问,因为这段代码起初正确地为列中的单元格着色,但是当我开始滚动此 table 中的彩色单元格时,它会将整个列重新着色为黄色的。 (见截图)
我想我可以添加 else 语句来专门将剩余的单元格着色为白色,但这种方法对我不起作用,因为我会覆盖我以前的单元格结果。
你能给我指出这个问题的解决方案吗? (这是一个错误,还是 JTable 的预期行为?)。我正在使用 NetBeans 和 GUI 拖放生成器
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class MyRenderer 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);
int[][] coordinatesYellow = new int[3][2];
//[row][column] these cells are yellow
coordinatesYellow[0][0] = 3;
coordinatesYellow[0][1] = 2;
coordinatesYellow[1][0] = 4;
coordinatesYellow[1][1] = 2;
coordinatesYellow[2][0] = 2;
coordinatesYellow[2][1] = 2;
for (int i = 0; i < 3; i++) {
if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) {
c.setBackground(Color.yellow);
}
}
return c;
}
}
// And this is the statement I use for calling the renderer:
// resultsTable.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer());
当您的单元格不应该是黄色时,将背景设置为白色(或 table 的背景色)。
扩展 DefaultTableCellRenderer
的渲染器使用相同的组件(JLabel
)作为所有单元格的模板(参见 DefaultTableCellRenderer
实现说明 - 他们称之为 rubber-stamping ).一旦您将其背景设置为黄色,它将在渲染连续单元格时保持黄色,直到您再次更改其背景颜色。
将您的 for 循环替换为如下内容:
boolean isYellow = false;
for (int i = 0; i < 3; i++) {
if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) {
c.setBackground(Color.yellow);
isYellow = true;
}
}
if( !isYellow )
c.setBackground(Color.white);
我正在寻找这个问题的解决方案: 我有一个 excel 文件,其中包含数据。一些单元格具有黄色背景。我已经创建了一个用于将文本导入 JTable 的代码,它工作正常。但我也想将背景单元格颜色导入特定单元格。为了这个例子的简单起见,我没有使用循环,从源等读取 excel 数据。阅读论坛后我明白我需要 CustomCellRenderer。
我对这种方法有疑问,因为这段代码起初正确地为列中的单元格着色,但是当我开始滚动此 table 中的彩色单元格时,它会将整个列重新着色为黄色的。 (见截图)
我想我可以添加 else 语句来专门将剩余的单元格着色为白色,但这种方法对我不起作用,因为我会覆盖我以前的单元格结果。
你能给我指出这个问题的解决方案吗? (这是一个错误,还是 JTable 的预期行为?)。我正在使用 NetBeans 和 GUI 拖放生成器
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class MyRenderer 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);
int[][] coordinatesYellow = new int[3][2];
//[row][column] these cells are yellow
coordinatesYellow[0][0] = 3;
coordinatesYellow[0][1] = 2;
coordinatesYellow[1][0] = 4;
coordinatesYellow[1][1] = 2;
coordinatesYellow[2][0] = 2;
coordinatesYellow[2][1] = 2;
for (int i = 0; i < 3; i++) {
if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) {
c.setBackground(Color.yellow);
}
}
return c;
}
}
// And this is the statement I use for calling the renderer:
// resultsTable.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer());
当您的单元格不应该是黄色时,将背景设置为白色(或 table 的背景色)。
扩展 DefaultTableCellRenderer
的渲染器使用相同的组件(JLabel
)作为所有单元格的模板(参见 DefaultTableCellRenderer
实现说明 - 他们称之为 rubber-stamping ).一旦您将其背景设置为黄色,它将在渲染连续单元格时保持黄色,直到您再次更改其背景颜色。
将您的 for 循环替换为如下内容:
boolean isYellow = false;
for (int i = 0; i < 3; i++) {
if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) {
c.setBackground(Color.yellow);
isYellow = true;
}
}
if( !isYellow )
c.setBackground(Color.white);