简体   繁体   中英

Unable to set custom background color in jTable

I am using the following code to set alternate background row color in a jTable :

table = new JTable(model);
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{//alternate background color for rows
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);
        if (!isSelected)
           c.setBackground(row % 2 == 0 ? Color.white : Color.lightGray);
        return c;
    };
});

And it works. However I would like to use a custom color say rgb (242,242,242) in place of lightGray as the alternate color, but when doing:

final Color alternateColor = new Color (242,242,242);
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{//alternate background color for rows
  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);
        if (!isSelected)
           c.setBackground(row % 2 == 0 ? Color.white : alternateColor);
        return c;
    };
});

the alternate color is completely ignored and all rows have white background. It looks like this method works only with colors which belong to the Color enum. How comes?

Here is a complete working example followed by the resulting screen :

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class Test extends JFrame
{
 private JTable             table               = null;
 private Object[]           columnTitle = { "Column1", "Column2", "Column3" };  
 private Object[][]         data                = null;
 private DefaultTableModel  model               = null;
 private JPanel             panel               = null;
 private JScrollPane        scroller            = null;

 public Test()
    {
        super();
        setLayout(new BorderLayout());
        panel = new JPanel();
        scroller=new JScrollPane();
        data = new Object[3][3];

        for (int i=0; i<3; i++)
            {
                for (int j=0; j<3; j++)
                    {
                        data [i][j]="Test";
                    }
            }

        model = new DefaultTableModel(data, columnTitle);
        table = new JTable(model);
        final Color alternateColor=new Color(242,242,242);
        table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
        {//alternate background color for rows
                    @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);
                            if ( !isSelected )
                                c.setBackground(row % 2 == 0 ? Color.white : alternateColor);
                            return c;
                        };
                });

        scroller.setViewportView(table);
        panel.add(scroller);
        this.add(panel, BorderLayout.CENTER);
    }

public static void main(String[] args)
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
                {
                    Test test = new Test();
                    test.setLocationRelativeTo(null);
                    test.pack();
                    test.setVisible(true);
                    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }
        });
    }
}

在此处输入图片说明

And here is the screen with Color.lightGray : 在此处输入图片说明

The approach of overriding the renderer only works if you have data (ie. String) that uses the default renderer in all your columns. What if you have Date or Number data in your table which require different renderers?

In this case check out Table Row Rendering for a solution that works for all data types.

Or maybe you can use:

UIManager.put("Table.alternateRowColor", Color.YELLOW);

Don't know if this property works on all LAF's.

Works fine for me...

测试

import com.alee.laf.WebLookAndFeel;
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;
import javax.swing.table.DefaultTableModel;

public class TestTable {

    public static void main(String[] args) {
        new TestTable();
    }

    public TestTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                WebLookAndFeel.install();

                DefaultTableModel model = new DefaultTableModel(new Object[]{"Test"}, 10);
                JTable table = new JTable(model);
                final Color alternateColor = new Color(255, 0, 255);
                table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {//alternate background color for rows
                    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);
                        if (!isSelected) {
                            c.setBackground(row % 2 == 0 ? Color.white : alternateColor);
                        }
                        return c;
                    }
                });
                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

It's possible that some other rendering has taken oven, that the table your setting the renderer to isn't the one that's on the screen...so many other factors that a runnable example which demonstrates your problem would elimnate...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM