java - 如何为 JTable 列标题添加渐变背景?

标签 java swing jtable gradient jtableheader

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

JTable table = new JTable(4, 5);

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

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

最佳答案

您是使用 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());
   }
}

关于java - 如何为 JTable 列标题添加渐变背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814590/

相关文章:

java - 使用自定义 TableCellRenderer 更改单元格的背景

java - 对于某些 Java 类型,将 Java 类型对象转换为字符串失败

Java GUI 在调整大小之前显示空白

java - Jmeter - future 时间戳

java - Swing 灵气 ShadowEffect

java - 如何通过 JPA 持久化从 JTable 检索的实体对象?

java - if-else-else if

java - 自定义 JTableHeader 导致 NullPointerException

java - 聊天 GUI 的组件选择

Java,使用 rs2xml 填充 jTable 时将 jTable 中的 boolean 列更改为复选框