una tamaño poner pintar imagen encabezado crear columnas color celdas celda cambiar cabecera java swing icons jtable imageicon

java - tamaño - ¿Cómo configurar el icono en la celda JTable?



jtable java netbeans (2)

Esto se hace a través del renderizador de células personalizado que puede extender JLabel . Puede establecer fácilmente el icono de JLabel . Aquí está el ejemplo adecuado .

Renderer es un componente que debe dibujarse como una celda de tabla después de que JTable llama a getTableCellRendererComponent para pasar el estado y el contenido de las celdas. Es común que un renderizador establezca propiedades por sí mismo y devuelva esto . El renderizador también puede devolver algún otro objeto siempre que amplíe Componente .

Estoy tratando de agregar un ícono de imagen en la celda de Jtable. Tengo un código como se menciona a continuación. ¿Qué debo hacer para eso?

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

Tengo un modelo de tabla como el de arriba. Quiero agregar un ícono de imagen en la celda de la tabla y quiero eliminar la celda cuando se presiona ese ícono. ¿Cómo puedo hacer con este código? Por favor dame una descripción completa sobre esto.


Puede usar un DefaltTableCellRenderer respaldado por un JLabel que luego puede usar para configurar el ícono.

La mejor solución sería ampliar DefaltTableCellRenderer e invalidar el método getTableCellRendererComponent y aplicar el icono según sea necesario en una celda por celda.

Puede aplicar renderizadores ya sea definiendo el renderizador predeterminado para un tipo de Class dado o directamente a la columna

Consulte Cómo utilizar JTables y Uso de renderizadores personalizados en particular

ACTUALIZADO con el ejemplo

Este es un enfoque, hay muchos más ...

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

Actualizado

¿Por qué no usar un JButton / TableCellEditor ? Este es el por qué