java jtable cellrenderer 在运行时更改单元格的背景颜色

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14563799/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 16:42:15  来源:igfitidea点击:

jtable cellrenderer changes backgroundcolor of cells while running

javaswingjtablebackground-colortablecellrenderer

提问by Steffen Riek

I'm trying to create a table and color specific cells either yellow, red or white, depending on the content of other columns. For that I am looping through the rows filling in the values and then checking on the contents. that works just fine for every row that is currently displayed on the screen, however when the program reaches rows that are not displayed or if the user try's to scroll every cell changes its backgroundcolor back to white. I have searched the web for solutions and the only idea that sounded reasonable was to reset the cellRenderer after each loop, which does not work because it resets every cell too.

我正在尝试创建一个表格,并根据其他列的内容将特定单元格着色为黄色、红色或白色。为此,我正在遍历填充值的行,然后检查内容。这对于当前显示在屏幕上的每一行都很好,但是当程序到达未显示的行或者用户尝试滚动每个单元格时,它的背景颜色会变回白色。我在网上搜索了解决方案,唯一听起来合理的想法是在每次循环后重置 cellRenderer,这不起作用,因为它也会重置每个单元格。

I hope someone knows a solution for this or can give me an idea where i mist out on something.

我希望有人知道对此的解决方案,或者可以给我一个想法,我在哪里弄错了。

I am using this loop

我正在使用这个循环

for(int e = 0; e < modules.size(); e++)
    {
    gui.clearOutputStream();
    gui.getOutputStream().setText("Load Modul " + modules.get(e) + "\r\n");
    version = getVersion(modules.get(e));

    //Update current Row
    updateRow(gui.getReleaseTabelle(), e);
    }

which calls this method

调用这个方法

public void updateRow(JTable target, int row){
//...
//insert Values here
//...
CustomRenderer cr = new CustomRenderer();
        cr.tab = target;
        if(!target.getValueAt(row, 2).equals(target.getValueAt(row, 3)))
        {
            cr.Val1 = target.getValueAt(row, 1).toString();
            target.setValueAt("X", row, 1);
        }
        else if(!target.getValueAt(row, 7).equals(""))
        {
            cr.Val1 = target.getValueAt(row, 1).toString();
            target.setValueAt("Y", row, 1);
        }
        else
        {

        }
        target.getColumnModel().getColumn(1).setCellRenderer(cr);

}

and this is my CustomRenderer

这是我的 CustomRenderer

class CustomRenderer extends DefaultTableCellRenderer 
    {
private static final long serialVersionUID = 6703872492730589499L;
        public String Val1; 
        public JTable tab;

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            if(tab.getValueAt(row, 1).equals("Y")){
                cell.setBackground(new java.awt.Color(255, 255, 0));
                tab.setValueAt(Val1, row, 1);
            }
            else if(tab.getValueAt(row, 1).equals("X")){
                cell.setBackground(new java.awt.Color(255, 50, 50));
                tab.setValueAt(Val1, row, 1);
            }
            else
            {
                //do nothing
            }
            return cell;
        }
    }

回答by Amarnath

Do not update table data in your CutomRenderer class.You Rendererclass should check the condition and color the cells. I have used your CustomRendererclass and rendered the cells basing on the data present in the cells. If the data of the cell is 'Y' color it to Yellow. If the data is 'N' then color it to Grey.

Do not update table data in your CutomRenderer class.您的Renderer班级应该检查条件并为单元格着色。我已经使用了您的CustomRenderer课程并根据单元格中存在的数据呈现了单元格。如果单元格的数据为“Y”,则将其着色为黄色。如果数据为“N”,则将其着色为灰色。

Rendering in JTable

在 JTable 中渲染

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


public class ColoringCells {

    private static Object[] columnName = {"Yes", "No"};
    private static Object[][] data = {
            {"Y", "N"},
            {"N", "Y"},
            {"Y", "N"}
    };


    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {

                JFrame frame = new JFrame();
                JTable table = new JTable(data, columnName);
                table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer());
                table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer());

                frame.add(new JScrollPane(table));
                frame.setTitle("Rendering in JTable");
                frame.pack();
                frame.setVisible(true);
            }
        };

        EventQueue.invokeLater(r);
    }
}


class CustomRenderer extends DefaultTableCellRenderer 
{
private static final long serialVersionUID = 6703872492730589499L;

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if(table.getValueAt(row, column).equals("Y")){
            cellComponent.setBackground(Color.YELLOW);
        } else if(table.getValueAt(row, column).equals("N")){
            cellComponent.setBackground(Color.GRAY);
        }
        return cellComponent;
    }
}