How to customize icon in JTable cell?

I am trying to add an image icon to a Jtable cell. I have a code as below. What should I do for this?

package com.orb; private final LinkedList<Product> list= new LinkedList<Product>(); private final LinkedList<Boolean> checkList = new LinkedList<Boolean>(); public void addItem(Product customer) { list.add(customer); checkList.add(false); checkList.remove(true); fireTableDataChanged(); } @Override public int getColumnCount() { return 6; } @Override public int getRowCount() { return list.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { Object obj = null; if(columnIndex==4){ setTotal(list.get(rowIndex)); } switch (columnIndex){ case 0: obj= list.get(rowIndex).getCode() ;break; case 1: obj=list.get(rowIndex).getDescription(); break; case 2: obj=list.get(rowIndex).getQuantity();break; case 3: obj=list.get(rowIndex).getPrice();break; case 4: obj=list.get(rowIndex).getTotal();break; } return obj; } @Override public Class<?> getColumnClass(int arg0) { switch(arg0){ case 0: case 1: return String.class; case 2: return Integer.class; case 3: case 4: return Double.class; //case 5: return ImageIcon.class; } return super.getColumnClass(arg0); } @Override public boolean isCellEditable(int arg0, int arg1) { boolean isCellEditable = false; switch(arg1){ case 2: case 3: isCellEditable= true;break; default: isCellEditable= false;break; } return isCellEditable; //return super.isCellEditable(arg0, arg1); } @Override public void setValueAt(Object arg0, int arg1, int arg2) { System.out.println("Value seted" +arg0 + arg1 + arg2); switch(arg2){ case 0: break; case 1: break; case 2: list.get(arg1).setQuantity((Integer)arg0); setTotal(list.get(arg1)); break; case 3: list.get(arg1).setPrice((Double)arg0); setTotal(list.get(arg1));break; case 4: list.get(arg1).setTotal((Double)arg0);break; //case 0: checkList.set(arg1, (Boolean)arg0);break; default:break; } fireTableDataChanged(); } public LinkedList<Product> getList() { LinkedList<Product> temp = new LinkedList<Product>(); int index=-1; for(Boolean isSelected:checkList){ index++; if(isSelected){ temp.add(list.get(index)); } } return temp; } public void deleteRow(int rowNubmer) { list.remove(rowNubmer); fireTableDataChanged(); } public void setTotal(Product product){ Double total = 0.0d; total = product.getQuantity ()* product.getPrice(); product.setTotal(total); } @Override public void fireTableDataChanged() { super.fireTableDataChanged(); } 

I have a tabular model as above. I want to add an image icon to a table cell and want to delete a cell when I click this icon. How can I do this with this code? Please give me a full description.

+4
source share
2 answers

You can use DefaltTableCellRenderer , which is supported by DefaltTableCellRenderer , which you can then use to set the icon.

A better solution would be to extend DefaltTableCellRenderer and override the getTableCellRendererComponent method and apply the icon needed for the cell in the cell

You can apply renderers either by defining the default renderer for the specified Class type, or directly in the column

See How to Use JTables and Using Custom Renderers in Particular

UPDATED with an example

This is approach A , there are many more ...

 public class TestTable { public static void main(String[] args) { new TestTable(); } public TestTable() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JTable table = new JTable(); table.setGridColor(Color.LIGHT_GRAY); table.setShowGrid(true); table.setShowHorizontalLines(true); table.setShowVerticalLines(true); table.setModel(new TestTableModel()); table.getColumn("X").setCellRenderer(new DeleteCellRenderer()); table.getColumn("X").setCellEditor(new DeleteCellEditor()); JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } protected class TestTableModel extends AbstractTableModel { private List<RowData> rowData; public TestTableModel() { rowData = new ArrayList<RowData>(25); for (int index = 0; index < 10; index++) { rowData.add(new RowData(index)); } } @Override public String getColumnName(int column) { return column == 0 ? "Text" : "X"; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { RowData rd = rowData.get(rowIndex); return rd.isDeletable(); } @Override public int getRowCount() { return rowData.size(); } @Override public int getColumnCount() { return 2; } @Override public Object getValueAt(int rowIndex, int columnIndex) { RowData rd = rowData.get(rowIndex); return columnIndex == 0 ? rd.getText() : rd.isDeletable(); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { RowData rd = rowData.get(rowIndex); if (columnIndex == 1) { if (aValue instanceof Boolean && (Boolean)aValue) { rowData.remove(rd); fireTableRowsDeleted(rowIndex, rowIndex); } } } } public class RowData { private String text; private boolean deletable; public RowData(int row) { text = "Row " + row; deletable = Math.round(Math.random() * 1) == 0; } public String getText() { return text; } public boolean isDeletable() { return deletable; } } public class DeleteCellRenderer extends DefaultTableCellRenderer { public DeleteCellRenderer() { try { BufferedImage img = ImageIO.read(getClass().getResource("/Delete.png")); setIcon(new ImageIcon(img)); } catch (IOException ex) { ex.printStackTrace(); } } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setText(null); if (value instanceof Boolean && (Boolean)value) { setEnabled(true); } else { setEnabled(false); } return this; } } public class DeleteCellEditor extends AbstractCellEditor implements TableCellEditor { private JLabel label; public DeleteCellEditor() { label = new JLabel("Delete"); } @Override public Object getCellEditorValue() { return true; } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { stopCellEditing(); } }); return label; } @Override public boolean isCellEditable(EventObject e) { return true; } } } 

Update

Why not use JButton / TableCellEditor ? That's why

+4
source

This is done through custom cell rendering, which can extend JLabel. You can easily set the icon for JLabel. Here is a suitable example .

Renderer is a component that should draw itself as a table cell after the JTable calls getTableCellRendererComponent, passing the state and contents of the cells. For rendering, you usually need to set the properties yourself and return them. The renderer may also return some other object if it extends the component.

+2
source

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


All Articles