【问题标题】:Is there a way to create a Gradient background for JTable?有没有办法为 JTable 创建渐变背景?
【发布时间】:2019-04-25 02:04:09
【问题描述】:

我已经放弃并在这个问题上寻求社区的帮助(不想再用我的头撞到这段代码(和我的笔记本电脑)了。

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

使用此链接here 中的帮助 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();
    }       
}

如果我取消注释 paintComponent() 方法并重新运行,渐变会覆盖整个表,因此无法查看基础数据。我知道我在上面链接的帖子中有一个类似的问题/答案,但我正在寻找类似于滚动窗格中显示的渐变。

提前感谢任何可以提供帮助的人 - 如果真的没有办法做到这一点,我会坚持我所拥有的。

【问题讨论】:

  • 这似乎比看起来更复杂,因为JTablepaintComponent 方法实际上绘制了表格的内容......所以调用super.paintComponent 然后填充它会,好吧,不会产生你想要的效果。
  • 在正常的工作中,你应该总是打电话给super.paintComponent,在这种情况下,你不想这样做。相反,您有点想绕着它跳舞并直接调用 UI 委托的paint 方法,对于example。这允许您根据需要绘制背景,然后在顶部绘制内容。
  • 另一种解决方案可能是在调用super.paintComponent之前让表格透明并自己绘制背景,这有点贵,因为Swing会尝试绘制表格后面的所有组件,无论如何
  • 渲染器也需要是透明的。这是一些旧 Sun 文件的链接,可让您进行渐变绘制(以及更多):jcomeau.com/src/java/com/sun/WatermarkDemo.
  • 感谢您的建议。我通过@camickr 的回答评论找到了我想要的东西。不过,只是想知道-反对票是为了什么?如果是上面的代码,那是我放在一起测试的一个示例,因为我不想用我的实际代码(这有点冗长)来混淆这个问题。

标签: java swing background jtable gradient


【解决方案1】:

所以离开 cmets,我只需要在代码中添加几行:

DefaultTableCellRenderer rend = new DefaultTableCellRenderer();
rend.setOpaque(false);
testTbl.setDefaultRenderer(Object.class, rend);
我还从@MadProgrammer 的链接中添加了一些代码来解决我的标题问题。再次感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多