Hovercraft Full of Eels helped me already by pointing me too a TableCellRenderer but now: I can draw a circle with no problems. I'm just confused as how the original ImageIcons(inside all cells) get overriden with empty cells and a black circle.
SSCEE:
package sccee;
import java.awt.Graphics;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class SCCEE extends JFrame {
private JTable spelbordTabel;
URL url = this.getClass().getResource("/resources/leeg.png");
ImageIcon leeg = new ImageIcon(new ImageIcon(url).getImage().getScaledInstance(100, 100, java.awt.Image.SCALE_SMOOTH));
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(() -> {
SCCEE testFrame = new SCCEE();
testFrame.setBounds(0, 0, 700, 700);
testFrame.setVisible(true);
});
}
public SCCEE() {
initComponents();
updateTableImages();
}
private void initComponents() {
spelbordTabel = new javax.swing.JTable();
spelbordTabel.setModel(new DefaultTableModel(new Object[][]{
{null, null, null, null, null, null, null},
{null, null, null, null, null, null, null},
{null, null, null, null, null, null, null},
{null, null, null, null, null, null, null},
{null, null, null, null, null, null, null},
{null, null, null, null, null, null, null},
{null, null, null, null, null, null, null},},
new String[]{
"Title 1", "Title 2", "Title 3", "Title 4", "Title 5", "Title 6", "Title 7"
}) {
@Override
public Class
getColumnClass(int columnIndex) {
return ImageIcon.class;
}
boolean[] canEdit = new boolean[]{false, false, false, false, false, false, false};
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit[columnIndex];
}
});
spelbordTabel.setAutoscrolls(false);
spelbordTabel.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
spelbordTabel.setOpaque(false);
spelbordTabel.setRequestFocusEnabled(false);
spelbordTabel.setRowHeight(100);
spelbordTabel.setRowSelectionAllowed(false);
spelbordTabel.setTableHeader(null);
spelbordTabel.setUpdateSelectionOnSort(false);
spelbordTabel.setVerifyInputWhenFocusTarget(false);
spelbordTabel.setBounds(0, 0, 700, 700);
spelbordTabel.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 4, true));
spelbordTabel.setDragEnabled(true);
spelbordTabel.setVisible(true);
spelbordTabel.getColumn("Title 1").setCellRenderer(
new DefaultTableCellRenderer() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(30, 30, 20, 20);
}
}
);
add(spelbordTabel);
}
public void updateTableImages() {
SwingWorker<Void, Void> worker2 = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws InterruptedException {
Thread.sleep(50);
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
spelbordTabel.setValueAt(leeg, i, j);
}
}
return null;
}
};
worker2.execute();
}
}
Anything obvious I'm missing out? (first time fiddling with tablecellrenderers).
Answer is: Somehow overriding the TabelCellRenderer also overrides to getColumnClass of the DefaultTabelModel that I have overriden. Solution is to make the renderer:
spelbordTabel.getColumn("Title 1").setCellRenderer(
new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row,
column);
((JLabel) cell).setIcon((Icon) value);
((JLabel) cell).setText("");
((JLabel) cell).setHorizontalAlignment(JLabel.CENTER);
return cell;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(30, 30, 20, 20);
}
}
);