【问题标题】:Unable to set custom background color in jTable无法在 jTable 中设置自定义背景颜色
【发布时间】:2014-10-30 00:57:18
【问题描述】:

我正在使用以下代码在 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;
    };
});

而且它有效。 但是我想使用自定义颜色说 rgb (242,242,242) 代替 lightGray 作为备用颜色,但是这样做时:

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

替代颜色被完全忽略,所有行都有白色背景。看起来此方法仅适用于属于 Color 枚举的颜色。怎么来的?

这是一个完整的工作示例,后面是生成的屏幕:

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

这是带有 Color.lightGray 的屏幕:

【问题讨论】:

  • 不,对我来说很好用。考虑提供一个runnable example 来证明您的问题。这将导致更少的混乱和更好的响应
  • 好吧,如果它适合你,它可能与我使用的 LAF 有关,即 Weblaf。我没有看到任何其他可能的原因......
  • 但是第一个示例适用于 weblaf?
  • 是的,带有“Color.lightGray”的那个可以正常工作。

标签: java swing jtable


【解决方案1】:

仅当您的所有列中都有使用默认渲染器的数据(即字符串)时,覆盖渲染器的方法才有效。如果您的表中有日期或数字数据需要不同的渲染器怎么办?

在这种情况下,请查看Table Row Rendering 以获得适用于所有数据类型的解决方案。

或者你可以使用:

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

不知道此属性是否适用于所有 LAF。

【讨论】:

  • 感谢您提供的信息 camickr !但是,正如上面评论中提到的:经过多次尝试,这被证明是位于椅子和屏幕之间的错误,毕竟与代码无关;))
  • @Zek101,我明白了。我只是想为您或其他阅读本文的人展示更灵活的解决方案。
【解决方案2】:

对我来说很好......

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

}

有可能其他一些渲染已经过时了,您将渲染器设置到的表格不是屏幕上的那个……还有很多其他因素,runnable example 证明了您的问题会消除.. .

【讨论】:

  • 非常感谢,我已经用可运行的示例和屏幕截图编辑了帖子。
  • 抱歉打扰,感谢您的帮助@MadProgrammer。最后,问题似乎与我的眼睛疲劳有关,而不是与代码有关;)
猜你喜欢
  • 2020-12-14
  • 2020-01-06
  • 2020-02-22
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2014-03-29
相关资源
最近更新 更多