Je voudrais créer une JTable transparente avec un rendu de cellule personnalisé. Fondamentalement, j'ai créé un JPanel opaque (couleur rouge) et un Jscroller non opaque et JTable. Donc ce que je m'attends à voir est quelque chose de proche du rouge mais à la place je vois les cellules de la table en couleur blanche. Peux-tu m'expliquer pourquoi? Ceci est mon exemple:Créer un JTable transparent
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class Example extends JPanel {
private static final long serialVersionUID = 1L;
int boardHeight = 200;
int boardWidth = 1;
JTable table;
Random random = new Random();
public Example() {
// setOpaque(true);
setBackground(Color.RED);
setLayout(new BorderLayout()); // !!
DefaultTableModel model = new DefaultTableModel(boardHeight,
boardWidth) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
// !! table = new JTable(this.boardHeight, this.boardWidth);
table = new JTable(model);
for (int row = 0; row < model.getRowCount(); row++) {
for (int col = 0; col < model.getColumnCount(); col++) {
String s = random.nextBoolean() ? "1" : "2";
model.setValueAt(s, row, col);
}
}
table.setDefaultRenderer(String.class,
new BoardTableCellRendererExample());
table.setFocusable(true);
table.setShowGrid(false);
table.setRowMargin(0);
table.setIntercellSpacing(new Dimension(0, 0));
table.setRowSelectionAllowed(true);
table.setVisible(true);
table.getTableHeader().setUI(null);
JScrollPane scroll = new JScrollPane(table);
table.setOpaque(false);
scroll.setOpaque(false);
scroll.setBackground(new Color(0, 0, 0, 0F));
table.setBackground(new Color(0, 0, 0, 0F));
this.add(scroll, BorderLayout.CENTER);
this.setPreferredSize(new Dimension(table.getPreferredSize().width,
(table.getPreferredSize().height + 85)));
}
private static void createAndShowUI() {
JFrame frame = new JFrame("Example");
frame.getContentPane().add(new Example());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setResizable(false);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
class BoardTableCellRendererExample extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int col) {
Component c = new CellComponentExample(table, value, isSelected,
hasFocus, row, col);
return c;
}
}
class CellComponentExample extends JComponent {
boolean isSelected;
boolean hasFocus;
int row;
int col;
public CellComponentExample() {
super();
setOpaque(false);
}
public CellComponentExample(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int col) {
this.isSelected = isSelected;
this.hasFocus = hasFocus;
this.row = row;
this.col = col;
}
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
g.setColor(new Color(0, 0, 0, 0F));
g.fillRect(0, 0, 100, 50);
g.setColor(Color.BLACK);
g.drawRect(0, 0, 100, 50);
}
}
Copie possible de [Java swing Table transparent] (https://stackoverflow.com/questions/9769909/java-swing-table-transparency) –
Si Jtable est dans JScrollPane: [Comment rendre l'arrière-plan d'une JTable transparente?] (https://stackoverflow.com/q/11609900)/243373 –