как добавить градиентный фон в заголовок столбца JTable?

Привет, как установить градиентный фон для заголовка столбца? У меня есть Jtable:

JTable table = new JTable(4, 5);

и попробуйте установитьColor: table.getTableHeader().setBackground(Color.blue);

но без успеха цвет заголовка столбца все тот же, и это всего лишь один цвет, и мне нужен градиент, спасибо за помощь


person hudi    schedule 18.10.2011    source источник


Ответы (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());
   }
}
person Hovercraft Full Of Eels    schedule 18.10.2011
comment
Я использую netbeans, но кодирую вручную. Я пытаюсь переопределить paintComponent - person hudi; 19.10.2011
comment
и только один дополнительный вопрос. теперь я хочу установить цвет переднего плана на белый, а цвет заголовка синий, но я не вижу заголовок, почему? table.getTableHeader().setForeground(Color.WHITE); - person hudi; 19.10.2011
comment
будьте осторожны, при установке пользовательских средств визуализации заголовков возникают ямки: значки сортировки"> stackoverflow.com/questions/7792586/ - person kleopatra; 19.10.2011