【问题标题】:how to add gradient background to JTable column header?如何将渐变背景添加到 JTable 列标题?
【发布时间】:2011-10-18 22:34:14
【问题描述】:

嗨,如何将渐变背景设置为列标题?我有 Jtable:

JTable table = new JTable(4, 5);

并尝试设置颜色:table.getTableHeader().setBackground(Color.blue);

但是没有成功,列标题的颜色仍然相同,这些只是一种颜色,我需要渐变 谢谢帮助

【问题讨论】:

    标签: java swing jtable gradient jtableheader


    【解决方案1】:

    您是使用 NetBean 的代码生成来编写代码还是手动编写 Swing?

    您是否尝试过创建一个扩展 JTableHeader 并覆盖其paintComponent 方法的类?试一试,在该方法中创建一个 GradientPaint 对象或其中一个变体使用它来设置 Graphics2D 绘制的属性,然后使用组件的当前尺寸调用 fillRect 以用渐变颜色填充它。

    例如,这里有两种方法可以做到这一点,一种是使用自定义 JTableHeader,另一种是使用表头使用的自定义单元格渲染器:

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class GradientHeader {
       private static void createAndShowGui() {
          JTable table1 = new JTable();
          GradientTableHeader gradientTableHeader = new GradientTableHeader();
          gradientTableHeader.setColumnModel(table1.getColumnModel());
          table1.setTableHeader(gradientTableHeader);
    
          DefaultTableModel model = new DefaultTableModel(new Integer[][] {
                { 1, 2 }, { 3, 4 } }, new String[] { "A", "B" });
    
          table1.setModel(model);
    
          JTable table2 = new JTable(model);
          table2.getTableHeader().setDefaultRenderer(new MyCellRenderer());
    
          JPanel mainPanel = new JPanel(new GridLayout(1, 0));
          mainPanel.add(new JScrollPane(table1));
          mainPanel.add(new JScrollPane(table2));
    
          JFrame frame = new JFrame("GradientHeader");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    class GradientTableHeader extends JTableHeader {
       private static final Color COLOR_1 = new Color(255, 0, 0, 240);
       private static final Color COLOR_2 = new Color(0, 0, 255, 120);
       private static final float SIDE = 50;
       private GradientPaint gradientPaint = new GradientPaint(0, 0, COLOR_1, SIDE,
             SIDE, COLOR_2, true);
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2 = (Graphics2D) g;
          g2.setPaint(gradientPaint);
          g2.fillRect(0, 0, getWidth(), getHeight());
       }
    }
    
    class MyCellRenderer extends JPanel implements TableCellRenderer {
       private static final Color COLOR_1 = new Color(255, 0, 0, 200);
       private static final Color COLOR_2 = new Color(0, 0, 255, 200);
       private static final float SIDE = 50;
       private GradientPaint gradientPaint = new GradientPaint(0, 0, COLOR_1, SIDE,
             SIDE, COLOR_2, true);
       private JLabel label = new JLabel();
    
       public MyCellRenderer() {
          setOpaque(true);
          setLayout(new BorderLayout());
          add(label, BorderLayout.CENTER);
          label.setHorizontalAlignment(SwingConstants.CENTER);
       }
    
       @Override
       public Component getTableCellRendererComponent(JTable table, Object value,
             boolean isSelected, boolean hasFocused, int arg4, int arg5) {
          label.setText(value.toString());
          return this;
       }
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2 = (Graphics2D) g;
          g2.setPaint(gradientPaint);
          g2.fillRect(0, 0, getWidth(), getHeight());
       }
    }
    

    【讨论】:

    • 我正在使用 netbeans,但我正在手动编码 swing。我尝试覆盖paintComponent
    • 还有一个问题。现在我想将前景色设置为白色,标题的颜色是蓝色,但我看不到标题为什么? table.getTableHeader().setForeground(Color.WHITE);
    • 小心,安装自定义头部渲染器有坑:stackoverflow.com/questions/7792586/…
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多