tutorial sintaxis setrowsorter setmodel getcolumnclass defaultmodeltable addrow java swing jtable tablecellrenderer abstracttablemodel

java - sintaxis - Utilizando TableCellRenderer y getColumnClass juntos



setmodel java (2)

Su método getColumnClass () devolverá: String.class, Double.class y Integer.class para las columnas 0, 1, 2.

JTable proporcionará el renderizador predeterminado para las columnas Doble y Entero.

Si desea usar su procesador personalizado para todas sus columnas, entonces debe hacer:

MyCustomTableCellRenderer renderer = new MyCustomTableCellRenderer(); table.setDefaultRenderer(Object.class, renderer); // or you could use "String.class" table.setDefaultRenderer(Double.class, renderer); table.setDefaultRenderer(Integer.class, renderer);

Cuando utilizas "Object.class" significa que usas el renderizador de objetos como renderizador de último recurso, solo si no se ha agregado a la tabla ningún otro procesador personalizado para la clase específica.

cuando agrego la clase getcolumn a mi abstracttablemodel, no pude usar mi TableCellRenderer personalizado para establecer el color de fondo. (Yo uso esto para clasificar, alinear columnas numéricas)

public Class getColumnClass(int columnIndex) { Object o = getValueAt(0, columnIndex); if (o == null) { return Object.class; } else { return o.getClass(); } }

Esto está lleno de mi código.

import java.awt.*; import java.text.DecimalFormat; import javax.swing.*; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.table.*; public class DemoRenderer extends JFrame { public static void main( String[] args ) { DemoRenderer frame = new DemoRenderer(); frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setVisible( true ); } public DemoRenderer() { JTable table = new JTable(); table.setModel(new MyTablemodel()); table.setDefaultRenderer(Object.class, new MyCustomTableCellRenderer()); // Tell the table what to use to render our column of doubles table.repaint(); //table.getColumnModel().getColumn(1).setCellRenderer(new DecimalFormatRenderer() ); getContentPane().add(new JScrollPane(table)); } } /** Here is our class to handle the formatting of the double values */ class MyCustomTableCellRenderer extends DefaultTableCellRenderer{ private static final DecimalFormat formatter = new DecimalFormat( "#0.00" ); public Component getTableCellRendererComponent (JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) { if(column==1) obj = formatter.format((Number)obj); Component cell = super.getTableCellRendererComponent( table, obj, isSelected, hasFocus, row, column); if (isSelected) { cell.setBackground(Color.green); } else { if (row % 2 == 0) { cell.setBackground(Color.cyan); } else { cell.setBackground(Color.lightGray); } } return cell; } } class MyTablemodel extends AbstractTableModel{ Object[] columnNames = { "A", "B", "C" }; Object[][] data = { { "1abc", new Double(850.503), 53 }, { "2def", new Double(36.23254), 6 }, { "3ghi", new Double( 8.3 ), 7 }, { "4jkl", new Double( 246.0943 ), 23 }}; @Override public int getRowCount() { return data.length; } @Override public int getColumnCount() { return columnNames.length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return data[rowIndex][columnIndex]; } public Class getColumnClass(int columnIndex) { Object o = getValueAt(0, columnIndex); if (o == null) { return Object.class; } else { return o.getClass(); } } }

muchas gracias por tus opiniones


Use TableColumn # setCellRenderer () para dibujar valores individuales para cada columna.

Solo agrega las líneas a continuación en tu código

MyCustomTableCellRenderer cellRenderer = new MyCustomTableCellRenderer(); for (int i = 0; i < table.getColumnCount(); i++) { table.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); }

en lugar de

table.setDefaultRenderer(Object.class, new MyCustomTableCellRenderer());

y tu problema será resuelto

Nota: Está utilizando DefaultTableCellRenderer que se aplicará en la celda, por lo tanto, use setCellRenderer() lugar de setDefaultRenderer() .

captura de pantalla: (se selecciona una fila)