【问题标题】:Color only specific cells in JTable仅对 JTable 中的特定单元格着色
【发布时间】:2023-04-04 13:06:01
【问题描述】:

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

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

我想我可以添加 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());

【问题讨论】:

标签: java jtable tablecellrenderer


【解决方案1】:

这样当你的单元格不应该是黄色时,你将背景设置为白色(或表格的背景颜色)。

扩展DefaultTableCellRenderer 的渲染器使用相同的组件(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);

【讨论】:

  • 这不能按预期工作。如果我在 for 循环中添加 else 语句,结果只有 sampletext 单元格是黄色的,因为 for 循环会覆盖结果。
  • @radox1912 在所有种情况下,您没有将颜色设置为黄色...这意味着如果您没有将任何东西设置为黄色,您应该设置它变成白色。
  • @radox1912 我添加了一个反映我的陈述的代码段。
  • 我测试了解决方案,布尔 isYellow 可以解决问题!非常感谢。
  • @radox1912 您可以通过接受答案(检查答案左上角的复选标记)来感谢我。顺便说一句,欢迎你 =)
猜你喜欢
  • 2013-07-31
  • 2017-04-07
  • 2013-03-14
  • 2021-03-02
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2013-06-30
相关资源
最近更新 更多