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