Java 如何使用hashMap设置行的颜色?

Java 如何使用hashMap设置行的颜色?,java,swing,Java,Swing,我想用所有不同的颜色给我的案例中的7行上色,但不是给整行上色,而是只给第一列上色 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.util.HashMap; import java.util.Map; import javax.swing.JFrame; import javax.swing.JScroll

我想用所有不同的颜色给我的案例中的7行上色,但不是给整行上色,而是只给第一列上色

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.util.HashMap;
import java.util.Map;

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

public class UsingHashTable extends JFrame {
    public static void main(String args[]) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Object rowData[][] = { 
            { "Row1", "Row1", "Row1" },
            { "Row2", "Row2", "Row2" },
            { "Row3", "Row3", "Row3" },
            { "Row4", "Row4", "Row4" },
            { "Row5", "Row5", "Row5" },
            { "Row6", "Row6", "Row6" },
            { "Row7", "Row7", "Row7" }
        };
        Object columnNames[] = { "Column One", "Column Two", "Column Three" };
        JTable table = new JTable(rowData, columnNames);

        JScrollPane scrollPane = new JScrollPane(table);
        table.setDefaultRenderer(Object.class, new Renderit());
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 150);
        frame.setVisible(true);
    }
}
在这里,我使用render类来完成这项工作并初始化贴图 然后我用钥匙检查行,但它没有帮助

class Renderit extends DefaultTableCellRenderer {
    Map<Integer, Color> map = new HashMap<>();

    public  renderit() {
        map.put(0, Color.blue);
        map.put(1, Color.yellow);
        map.put(2, Color.red);
        map.put(3, Color.green);
        map.put(4, Color.pink);
        map.put(5, Color.orange);
        map.put(6, Color.magenta);
    }

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

        for(Map.Entry<Integer, Color> enp : map.entrySet()) {
            int key = enp.getKey();

            if(key==row) {
                table.setBackground(enp.getValue());
            } else if(key==row) {
                table.setBackground(enp.getValue());
            } else if(key==row) {
                table.setBackground(enp.getValue());
            } else if(key==row) {
                table.setBackground(enp.getValue());
            } else if(key==row) {
                table.setBackground(enp.getValue());
            } else if(key==row) {
                table.setBackground(enp.getValue());
            } else if(key==row) {
                table.setBackground(enp.getValue());
            }
        }
        return comp;
    }
}
class Renderit扩展了DefaultTableCellRenderer{
Map Map=newhashmap();
公众意见{
map.put(0,颜色为蓝色);
地图。放置(1,颜色。黄色);
地图。放置(2,颜色。红色);
地图。放置(3,颜色。绿色);
地图。放置(4,颜色。粉红色);
地图。放置(5,颜色。橙色);
地图。放置(6,颜色。洋红色);
}
@凌驾
公共组件GetTableCellRenderComponent(
JTable表,对象值,
布尔值为已选,布尔值为焦点,
整数行,整数列){
Component comp=super.GetTableCellRenderComponent(
表,值,isSelected,hasFocus,行,列
);
对于(Map.Entry enp:Map.entrySet()){
int key=enp.getKey();
如果(键==行){
表1.setBackground(enp.getValue());
}else if(键==行){
表1.setBackground(enp.getValue());
}else if(键==行){
表1.setBackground(enp.getValue());
}else if(键==行){
表1.setBackground(enp.getValue());
}else if(键==行){
表1.setBackground(enp.getValue());
}else if(键==行){
表1.setBackground(enp.getValue());
}else if(键==行){
表1.setBackground(enp.getValue());
}
}
返回补偿;
}
}

我不知道我在哪里出错,请帮助。

错误在
Renderit
类的
gettableCellRenderComponent
方法中

  • 正如我们已经提到的那样, 您有7个if/else分支都在做相同的事情。 只有一个if分支会有同样的效果
  • 您可以设置整个
    表的背景。
    相反,您应该只设置CellRenderComponent
    comp
    的背景 总而言之,您更正的方法可以如下所示:

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);
    
        for (Map.Entry<Integer, Color> enp : map.entrySet()) {
            int key = enp.getKey();
    
            if (key == row) {
                comp.setBackground(enp.getValue());
            }
    
        }
    
        return comp;
    }
    

    与您的问题无关,但是如果7个
    if-else
    s都具有相同的条件,为什么您会有一个链呢?但是您能告诉我为什么您没有使用table.paint();什么时候使用它?@anrdggle TableCellRenderer(更准确地说,是您通过
    super.getTableCellRenderComponent
    获得的)为您绘制。在Swing中,您从不自己调用
    paint
    。相反,您依赖于Swing在适当的时间调用
    paint
    。但这是一个不同的(非常大的)故事。只需谷歌搜索,你就会发现很多优秀的文章。
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);
    
        Color color = map.get(row);
        if (color != null) {
            comp.setBackground(color);
        }
    
        return comp;
    }