Есть ли способ создать градиентный фон для JTable? - PullRequest
0 голосов
/ 25 апреля 2019

Я сдался и обратился за помощью к сообществу по этой проблеме (хотел бы прекратить стучать головой об этот код (и мой ноутбук).

Я пытаюсь создать градиентный фон для моего JTable - я проверил на этом сайте и на нескольких форумах способы создания градиентного фона для различных компонентов. Большинство форумов предлагают переопределить метод paintComponent() и установить прозрачный компонент JTable.setOpaque(false). Я пробовал это в нескольких конфигурациях без успеха.

Используя справку 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() и перезапущу, градиент охватывает всю таблицу, так что базовые данные не могут быть просмотрены. Я знаю, что есть аналогичный вопрос / ответ в посте, который я связал выше, но я ищу градиент, похожий на тот, что показан на полосе прокрутки.

Заранее спасибо всем, кто может помочь - если на самом деле нет способа сделать это, я буду придерживаться того, что у меня есть.

1 Ответ

0 голосов
/ 26 апреля 2019

Итак, от комментариев было всего несколько строк, которые мне нужно было добавить в код:

DefaultTableCellRenderer rend = new DefaultTableCellRenderer();
rend.setOpaque(false);
testTbl.setDefaultRenderer(Object.class, rend);
Я также добавил код из ссылки @ MadProgrammer, чтобы исправить проблему с моими заголовками. Еще раз спасибо за помощь.
...