CellRenderer exception, ImageIcon disappears

Hovercraft Full of Eels helped me by pointing me to TableCellRenderer as well, but now: I can draw a circle without any problems. I'm just confused about how the original ImageIcons (inside all cells) get an excess of 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();
    }
}

State atm

Anything obvious I'm missing? (first time messing around with tablecellrenderers).

+4
source share
4 answers

Answer: somehow overriding TabelCellRenderer also overrides getColumnClass from DefaultTabelModel that I exceeded. The solution is to render:

        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);
                }

            }
    );
+1
source

100% , , , JTable, .

+1

, "" :

"- TabelCellRenderer getColumnClass DefaultTabelModel, ."

:

, , , . , getColumnClass, . , . , . :

  • Boolean - .
  • - .
  • Double, Float - , Number, NumberFormat ( ).
  • - , , DateFormat ( ).
  • ImageIcon, Icon - .
  • - , .

. getColumnClass(), Object , , toString(), , javax.swing.ImageIcon.... , . , . getColumnClass() . , getColumnClass() .

+1
source

I'm just confused about how the original ImageIcons (inside all cells) get overriden with empty cells and a black circle.

The cells in the first column are displayed in black circles because you have explicitly assigned a visualizer that draws this in the column ("Heading 1"). The rest of the cells are all empty because you specified null for your values, and the default renderer used is JLabel.

0
source

Source: https://habr.com/ru/post/1540875/


All Articles