JTable, cambiar el background de una FILA

2,053 views
Skip to first unread message

pwal...@gmail.com

unread,
Sep 25, 2006, 6:49:41 AM9/25/06
to JavaSOS
Hola a todos, estoy interesado en cambiar el fondo de las filas de una
JTable. Estuve buscando en Google pero no entiendo mucho, lo de los
CellRenderers...

Los colores los tengo en una clase que se llama Grafico.colores[i],
donde i es la fila correspondiente.

Es para mostrar datos pertenecientes a un gráfico.

Y de ser posible y no mucho mas complicado, también que no se pueda
editar el contenido de las celdas. No siendo tan importante esto
último.

Desde ya muchas gracias!!!

David Castañeda

unread,
Sep 25, 2006, 10:57:50 AM9/25/06
to jav...@googlegroups.com
mira esto ... leelo y lo que no entiendas con gusto te doy una mano...

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

de cualquier forma te adelanto que para lo del color lo mejor es hacerlo sobreescribiendo el metodo prepareRenderer del JTable

suerte.

pwal...@gmail.com

unread,
Sep 25, 2006, 2:23:22 PM9/25/06
to JavaSOS
Gracias por responder, posteo como lo solucione, como para que le sirva
a alguien mas:

/** Esta clase es para que no se puedan editar las filas */
public class MyCellEditor extends AbstractCellEditor implements
TableCellEditor, ActionListener {
public Object getCellEditorValue() {
return null;
}

public Component getTableCellEditorComponent(JTable table, Object
value, boolean isSelected, int row, int column) {
return null;
}

public void actionPerformed(ActionEvent e) {
}

}


/** Esta clase es para poner los colores de fondo */
public class MyCellRenderer extends JLabel implements TableCellRenderer
{

public MyCellRenderer() {
setOpaque(true);
}

public Component getTableCellRendererComponent(JTable table, Object
value, boolean isSelected, boolean hasFocus, int row, int column) {
this.setBackground( new Color(Grafico.colores[row].getRed(),
Grafico.colores[row].getGreen(), Grafico.colores[row].getBlue(),50) );
this.setText(value.toString());

this.setFont(new Font("Arial", Font.BOLD, 10));

return this;
}

}

/** Y luego para ponerlo en la JTable */
this.tblInforme.setDefaultRenderer(Object.class, new
MyCellRenderer());
this.tblInforme.setDefaultEditor(Object.class, new
MyCellEditor());

David Castañeda

unread,
Sep 26, 2006, 11:10:55 AM9/26/06
to jav...@googlegroups.com
Hola bueno pues perdona que me meta en tu solucion aunque bien no es la mas sencilla desafortunadamente... te escribo algo para que lo tengas en mente y lo puedas solucionar mas facil que ese...


primero... el CellEditor unicamente se activa si el metodo en el TableModel

public boolean isCellEditable(int row, int column) {
        return false;
    }

con este metodo desde el table model indicas que celdas se pueden editar y cuales no. con ese que te pegue ahi que es el por defecto nunca se podrian editar.


para lo del color de las celdas...

    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        super.prepareRenderer(renderer, row, column);
        JComponent c = (JComponent) renderer;
        c.setBorder(CELL_BORDER);

        if (!getSelectionModel().isSelectedIndex(row)) {
            if (row % 2 == 0) {
                c.setBackground(LIST_EVEN_COLOR);
            } else {
                c.setBackground(LIST_ODD_COLOR);
            }
        } else {
            c.setBackground(this.getSelectionBackground());
        }
        return c;
    }


espero te sirva..... lo que yo pienso es que es mejor de esta forma siempre porque el color es algo que generalmente no esta relacionado con el bussines logic de la app

Walter Poch

unread,
Sep 26, 2006, 12:41:49 PM9/26/06
to jav...@googlegroups.com

Lo del “prepareRenderer”, tambien es en el TableModel?, en este caso tiene algo que ver con la lógica de negocio, porque hace referencia a unos gráficos pero esa solución también me sirve, en mi casa estaba usando el DefaultTableModel, porque es una Tabla de 5x5, con datos estáticos, es para mostrar unos resultados, desde ya muchas gracias!

 

Saludos,

 

Walter Poch

Cel: (02477) 15 454216


leonel parra

unread,
Sep 26, 2006, 3:08:26 PM9/26/06
to jav...@googlegroups.com
Yo lo he manejado con una clase que ejecuta el Renderer

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

class generalRenderer extends JLabel implements TableCellRenderer {    Font f = new Font( "Helvetica",Font.PLAIN,10 );
 Color colGeneralSel = new Color(117, 204, 169);

 Color colGeneral = new Color(225, 244, 238);

 public generalRenderer() {
  setOpaque(true);
 }

 public Component getTableCellRendererComponent(JTable tabla, Object valor, boolean isSelected, boolean hasFocus,
   int row, int column) {
  setHorizontalAlignment(CENTER);
  if (isSelected) {
   setBackground(colGeneralSel);
  } else {
   setBackground(colGeneral);
  }
  try {
   setFont(f);
   setText(valor.toString());
  } catch (NullPointerException npe) {
   System.out.println(valor.toString());
   setText("0");
  }
  return this;
 }
}

y en la definicion de la tabla se pone

 
TblPosicion.getColumnModel().getColumn(3).setCellRenderer(new generalRenderer());
 
de esa manera aplica el renderer a la columna, los colores son diferentes si la celda esta seleccionada o no.
espero sirva
 
Leonel
Reply all
Reply to author
Forward
0 new messages