Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jtable cellrenderer在运行时更改单元格的背景颜色_Java_Swing_Jtable_Background Color_Tablecellrenderer - Fatal编程技术网

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

Java jtable cellrenderer在运行时更改单元格的背景颜色,java,swing,jtable,background-color,tablecellrenderer,Java,Swing,Jtable,Background Color,Tablecellrenderer,我正在尝试创建一个表,并根据其他列的内容创建特定于颜色的单元格(黄色、红色或白色)。为此,我在各行中循环填充值,然后检查内容。这对于屏幕上当前显示的每一行都很好,但是当程序到达未显示的行时,或者如果用户尝试滚动每个单元格,则会将其背景色更改为白色。我在网上搜索过解决方案,唯一听起来合理的想法是在每次循环后重置cellRenderer,这不起作用,因为它也会重置每个单元格 我希望有人知道这个问题的解决方案,或者能给我一个想法,我在什么事情上迷茫了 我正在使用这个循环 for(int e = 0;

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

我希望有人知道这个问题的解决方案,或者能给我一个想法,我在什么事情上迷茫了

我正在使用这个循环

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);
    }
这是我的客户服务

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;
        }
    }

不要更新CutomRenderer类中的表数据。
您的
渲染器
类应该检查条件并为单元格着色。我已经使用了您的
CustomRenderer
类,并根据单元格中的数据渲染了单元格。如果单元格的数据为“Y”,则将其涂成黄色。如果数据为“N”,则将其颜色设置为灰色

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;
    }
}


为了获得更好的帮助,请尽快在CustomRenderer类选项卡中发布一个简短的、可运行的、可编译的setValueAt(Val1,row,1);有。为什么需要这个声明?您应该仅将CustomRenderer类用于渲染颜色。您正在重置表中的某些内容。这可能就是问题所在。但是,当程序到达未显示的行时,或者如果用户尝试滚动每个单元格,则会将其背景颜色更改回白色。有些地方你的逻辑是错误的,这导致了问题。永远不要在渲染器中更改表/模型好的,在你们告诉我不要在渲染器中更改表上的任何内容后,我找到了一个解决方案,这迫使我不去管这些值,而是从渲染器中检查其他列(table.getValueAt(row,column)完全可以这样做,我还必须编辑cell.setBackground(new java.awt.Colo(255,255,255))的最后一个else,而不是什么都不做。因此,我的上一个假设是正确的,但如果没有您的评论,我永远不会有这个想法。谢谢Che和kleopatra:)
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;
    }
}