当前位置: 首页 > 知识库问答 >
问题:

无法在jTable中设置自定义背景色

夹谷星剑
2023-03-14

我使用以下代码来设置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(242242))代替浅灰色作为替代颜色,但在执行以下操作时:

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

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

下面是一个完整的工作示例,随后是结果屏幕:

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

共有2个答案

沈乐邦
2023-03-14

对我来说很好。。。

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

}

有可能是其他一些渲染已被使用,渲染器设置为的表不是屏幕上的表。。。许多其他的因素,一个可以运行的例子来证明你的问题会消除。。。

衡子安
2023-03-14

重写渲染器的方法只有在您有数据(即。String)在所有列中使用默认渲染器。如果您的表中有日期或数字数据,需要不同的渲染器,该怎么办?

在本例中,请查看适用于所有数据类型的解决方案的表行呈现。

或者您可以使用:

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

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

 类似资料:
  • 问题内容: 我正在使用python 2.7和xlwt模块进行excel导出 我想设置一个我可以使用的单元格的背景色 但我想设置自定义颜色smth。例如#8a8eef或是否存在可能的颜色调色板,因为浅蓝色无法正常工作:) 谢谢 问题答案: 如果您不使用而是逐步构建对象,则这是使用用户友好颜色名称的另一种方法:

  • 问题内容: 首先,我要说的不是关于渲染表格单元。 这是我基于数据库中的对象使用2D数组构建的TableModel 。 我的问题是如何使用表中的选定行取回对象。请注意,我无法创建新对象并用行数据填充它。我必须获取查询的对象(中的对象)。那么,他们用表行设置Object的任何方法吗? 这是我的课。 问题答案: 无需在创建模型之前拆分对象,而是将其直接添加到模型中并允许模型为您完成工作… 例如 这样,您

  • 我将Firebaseui的登录屏幕进行子类化: 当我看到登录屏幕上加载的xib LoginText时,我的实现工作正常。但背景颜色却被完全忽略了。 如何从该子类在登录屏幕上强制使用bg颜色? 编辑:如果我将下面的答案与View.InsertSubView(imageViewBackground,在:0)一起应用 我得到的是: 正如您所看到的,图像被插入到包含login按钮的视图下。如果我设置“在:

  • 我有一个按钮,它包含一个抽屉和文本。我希望按钮的背景不同于正常提供的(最好是一个普通的颜色)。这工作得很好,我只需在XML文件中使用属性并相应地分配颜色。然而,我希望背景改变为不同的颜色时,选择或聚焦(状态选择器)。 我尝试用定义的颜色在一个可绘制的文件夹中创建一个选择器(当处理按钮的文本时很好地工作),如下所示: 并将此xml设置为属性,如下所示: 但这会引起一个力闭合,说明: 但资源就在那里。

  • 本文向大家介绍Android自定义Button并设置不同背景图片的方法,包括了Android自定义Button并设置不同背景图片的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android自定义Button并设置不同背景图片的方法。分享给大家供大家参考,具体如下: 1、自定义MyButton类 2、 在xml布局文件中添加MyButton控件,像应用普通的Button控件一样。 其

  • 问题内容: 我正在尝试为xssfcell设置一些自定义的颜色(从hexcode或rgb值开始),但是即使我提供了其他颜色,单元的颜色也正在变成黑色。我尝试通过以下方式进行操作: //程序结束 我尝试了其他在相关问题答案中提到的其他方法,但是这些方法都没有解决我的问题。请帮帮我。 问题答案: 这是由于软件包org.apache.poi.ss.util不完整引起的。 以及和仅基于级别而不是基于级别。但