Java - Jtable颜色

jea*_*par 2 java swing jtable tablecellrenderer

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import java.awt.*;

public class Fenetre extends JFrame implements TableCellRenderer {
    private static TableCellRenderer tcr;

    public Fenetre(TableCellRenderer tcr){
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Liste des PC de la DTARS");
        this.setSize(500, 250);

        Object[][] data = {
                {"nomPc", "PC Fixe", "xxxx","OK","24"},
                {"nomPc", "PC Fixe", "xxxx","OK","24"},
                {"nomPc", "PC Fixe", "xxxx","A REMPLACER","24"},
                {"nomPc", "PC Fixe", "xxxx","A REMPLACER","24"},
                {"nomPc", "PC Portable", "xxxx","OK","NA"},
                {"nomPc", "PC Portable", "xxxx","OK","NA"},
                {"nomPc", "PC Fixe", "xxxx","OK","24"},
                {"nomPc", "PC Fixe", "xxxx","OK","24"},
                {"nomPc", "PC Fixe", "xxxx","OK","24"},
                {"nomPc", "PC Fixe", "xxxx","OK","24"},
                {"nomPc", "PC Fixe", "xxxx","OK","24"},
                {"nomPc", "PC Fixe", "xxxx","OK","24"},

        };

         String  title[] = {"Nom Machine", "Type", "Utilisateur","Etat","Ecran"};
        JTable tableau = new JTable(data, title);
        //tableau.setBackground(Color.cyan);
        DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
        rightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        tableau.getColumn("Type").setCellRenderer( rightRenderer );
        tableau.getColumn("Utilisateur").setCellRenderer( rightRenderer );
        tableau.getColumn("Etat").setCellRenderer( rightRenderer );
        tableau.getColumn("Ecran").setCellRenderer( rightRenderer );
        tableau.setAutoCreateRowSorter(true);
        this.getContentPane().add(new JScrollPane(tableau));

    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = this.tcr.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if ((row & 1) == 0) { // Ligne paire
            comp.setBackground(Color.RED);
        } else { // Ligne impaire
            comp.setBackground(Color.BLUE);
        }
        return comp;
    }

    public static void main(String[] args){
        Fenetre fen = new Fenetre(tcr);
        fen.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在与上面的代码作斗争.能否请您解释一下有什么问题以及如何解决不改变颜色的线条.

dic*_*c19 5

您的代码有两个问题:

  1. DefaultTableCellRenderer为表的列设置了一个新的而不是this.请注意,您的Fenetre类是一种重写 getTableCellRendererComponent(...)方法,以便更改单元格背景颜色.

  2. 您的getTableCellRendererComponent(...)实现将作业分解为创建tcr类成员的渲染器组件,该组件是a TableCellRenderer并且未初始化.所以你会得到一个 NullPointerException

怎么解决?

只需提供正确的TableCellRenderer实施.我不会让类直接实现接口,我摆脱了tcr类成员,我提供了这样的DefaultTableCellRenderer重写getTableCellRendererComponent(...):

DefaultTableCellRenderer renderer = new DefaultTableCellRenderer() {
    @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);
        if ((row % 2) == 0) { // Ligne paire
            comp.setBackground(Color.RED);
        } else { // Ligne impaire
            comp.setBackground(Color.BLUE);
        }
        return comp;
    }
};

renderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);

tableau.getColumn("Type").setCellRenderer(renderer);
tableau.getColumn("Utilisateur").setCellRenderer(renderer);
tableau.getColumn("Etat").setCellRenderer(renderer);
tableau.getColumn("Ecran").setCellRenderer(renderer);
Run Code Online (Sandbox Code Playgroud)