Java 有没有办法为JTable创建渐变背景?

Java 有没有办法为JTable创建渐变背景?,java,swing,background,jtable,gradient,Java,Swing,Background,Jtable,Gradient,我已经放弃了,并在这个问题上寻求社区的帮助(我不想再对这个代码(和我的笔记本电脑)动脑了) 我正在尝试为我的JTable创建渐变背景-我已经在这个网站和多个论坛上查看了为各种组件创建渐变背景的方法。大多数论坛建议覆盖paintComponent()方法,并将组件设置为透明JTable.setOpaque(false)。我已经在多种配置中尝试过,但都没有成功 使用此链接中的help GradientViewport,我可以为滚动窗格设置渐变背景,但不能为表格本身设置渐变背景。下面是我为解决此问题而

我已经放弃了,并在这个问题上寻求社区的帮助(我不想再对这个代码(和我的笔记本电脑)动脑了)

我正在尝试为我的
JTable
创建渐变背景-我已经在这个网站和多个论坛上查看了为各种组件创建渐变背景的方法。大多数论坛建议覆盖
paintComponent()
方法,并将组件设置为透明
JTable.setOpaque(false)
。我已经在多种配置中尝试过,但都没有成功

使用此链接中的help GradientViewport,我可以为滚动窗格设置渐变背景,但不能为表格本身设置渐变背景。下面是我为解决此问题而编写的一些示例代码:

import java.awt.*;
import java.util.Random;

import javax.swing.*;
import javax.swing.table.*;

public class GradientTest
{
    private static final Color C1 = new Color(255, 200, 200);
    private static final Color C2 = new Color(200, 200, 255);
    
    private GradientViewport viewport;

    private JTable testTbl;
    
    private JPanel mainPanel = new JPanel();
    private JFrame frame = new JFrame();

    private String[] answer = {"Yes", "No"};
    private String[] first = {"Jack", "Kelly", "Mike", "Lisa"};
    private String[] last = {"Donovan", "Marshall", "Jones", "Kinder"};
    
    public GradientTest()
    {
        String [] colNames = {"First Name", "Last Name", "Eligible"};
        DefaultTableModel model = new DefaultTableModel(colNames, 0);
        
        testTbl = new JTable(model);
//      {
//          @Override
//          protected void paintComponent(Graphics g)
//          {
//              super.paintComponent(g);
//              GradientPaint gp = new GradientPaint(0, 0, C1, getWidth(), getHeight(), C2, false);
//              Graphics2D g2d = (Graphics2D) g;
//              g2d.setPaint(gp);
//              g2d.fillRect(0, 0, getWidth(), getHeight());
//          }
//      };
        
        for(int x=0; x<10; x++) {
            
            String fName = first[new Random().nextInt(first.length)];
            String lName = last[new Random().nextInt(last.length)];
            String areaMonitor = answer[new Random().nextInt(answer.length)];
            
            model.addRow(new Object[] {fName, lName, areaMonitor});
        }
        
        testTbl.setOpaque(false);
        
        JScrollPane scrollPane = new JScrollPane();
        viewport = new GradientViewport(C1, C2);
        viewport.setView(testTbl);
        
        scrollPane.setBorder(BorderFactory.createEmptyBorder());
        scrollPane.setViewportBorder(null); //removes border from table
        scrollPane.setViewport(viewport);
        
        mainPanel.add(scrollPane);
        
        frame.add(mainPanel);
        frame.pack();
        
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new GradientTest();
    }       
}
import java.awt.*;
导入java.util.Random;
导入javax.swing.*;
导入javax.swing.table.*;
公共类梯度测试
{
专用静态最终颜色C1=新颜色(255、200、200);
专用静态最终颜色C2=新颜色(200200255);
私有渐变视口;
专用jtabletesttbl;
private JPanel mainPanel=new JPanel();
私有JFrame=新JFrame();
私有字符串[]答案={“是”、“否”};
私有字符串[]first={“杰克”、“凯利”、“迈克”、“丽莎”};
私有字符串[]last={“Donovan”、“Marshall”、“Jones”、“Kinder”};
公共梯度测试()
{
字符串[]colNames={“名字”、“姓氏”、“合格”};
DefaultTableModel=新的DefaultTableModel(colNames,0);
testTbl=新的JTable(模型);
//      {
//@覆盖
//受保护组件(图形g)
//          {
//超级组件(g);
//GradientPaint gp=新的GradientPaint(0,0,C1,getWidth(),getHeight(),C2,false);
//Graphics2D g2d=(Graphics2D)g;
//g2d.setPaint(总成);
//fillRect(0,0,getWidth(),getHeight());
//          }
//      };

对于(int x=0;x,因此在注释中,我只需要添加几行代码:

DefaultTableCellRenderer rend=新建DefaultTableCellRenderer();
格式设置不透明(假);

testTbl.setDefaultRenderer(Object.class,rend)
这似乎比它看起来更复杂,因为
JTable
paintComponent
方法实际上绘制了表的内容……所以调用
super.paintComponent
然后填充它,很好,不会产生您想要的效果。而在正常工作中,您应该始终调用
super.paintComponent
,在本例中,您不想这样做。相反,您可能希望围绕它跳舞,并直接调用UI委托的绘制方法。这允许您根据需要绘制背景,然后在顶部绘制内容。另一种解决方案可能是使表格透明,并绘制bac在调用
super.paintComponent
之前,这有点昂贵,因为Swing将尝试在桌子后面绘制所有组件,而渲染器也需要透明。这里有一些旧Sun文件的链接,允许您进行渐变绘制(以及更多):。谢谢你的建议。我从@camickr的回答评论中找到了我想要的。不过,我只是想知道-反对票是什么?如果是上面的代码,那就是我放在一起测试的一个示例,因为我不想用我的实际代码(有点长)来纠缠这个问题。