仅对JTable中的特定单元进行着色

rad*_*912 5 java jtable tablecellrenderer

我正在寻找这个问题的解决方案:我有一个包含数据的excel文件.一些细胞具有黄色背景.我已经创建了一个代码,用于将文本导入JTable,工作正常.但我也想将背景单元格颜色导入特定单元格.为简单起见,这个例子,我没有使用循环,从源等读取excel数据.阅读论坛后我明白我需要CustomCellRenderer.

我有这个方法的问题,因为这个代码首先正确地着色列中的单元格,但是当我开始滚动此表中的彩色单元格时,它将整个列重新着色为黄色.(见截图)

我以为我可以添加else语句来专门将剩余的单元格着色为白色,但这种方法对我来说不起作用,因为我会覆盖以前的单元格结果.

你能指点我这个解决方案吗?(这是一个bug,还是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());
Run Code Online (Sandbox Code Playgroud)

TT.*_*TT. 2

当您的单元格不应为黄色时,请将背景设置为白色(或表格的背景颜色)。

扩展的渲染器DefaultTableCellRenderer使用相同的组件 (a JLabel) 作为所有单元的模板(参见DefaultTableCellRenderer实现说明 - 他们称之为橡皮图章)。一旦将其背景设置为黄色,它将保持黄色以渲染连续的单元格,直到您再次更改其背景颜色。

将 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);
Run Code Online (Sandbox Code Playgroud)