entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Colorear JTable

Buenas tardes compañeros, estoy intentando dar color a un Jtable

public Component getTableCellRendererComponent(JTable tbl, Object value,
        boolean selected, boolean focused, int row, int column) {
    // Recoger la fecha del sistema y restarle 30 días
    Calendar calendar = GregorianCalendar.getInstance();
    Date fecha = calendar.getTime();
    calendar.setTime(fecha);
    calendar.add(Calendar.DAY_OF_YEAR, -30);
    Date tiempo = calendar.getTime();
    SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd-MM-yyyy");
    // Inicio la busqueda de las fechas correspondientes para cambiar su fondo a "rojo"
    String prueba = null;
    for (int i = 0; i < tbl.getColumnCount(); i++) {
        if (tbl.getColumnName(i).equals("FECHA DE ENTREGA")) {
            int count = tbl.getSelectedColumn() + (i + 1);
            for (int a = 0; a < tbl.getRowCount();) {
                prueba = tbl.getValueAt(a, count).toString();
                System.out.println(prueba);
                // Una vez recogido los datos, se hace un parse
                Date fechapedido = null;
                try {
                    fechapedido = formatoDeFecha.parse(prueba);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                JLabel cell = (JLabel) super.getTableCellRendererComponent(tbl, value,
                        selected, focused, a, count);
                if (fechapedido.before(tiempo)) {
                    System.out.println(fechapedido+"//"+tiempo);
                    cell.setBackground(Color.ORANGE);
                    return cell;
                } else {
                    cell.setBackground(Color.BLACK);
                    return cell;
                }
            }
        }
    }
    return null;
}

El problema es que me pinta toda la tabla, no las celdas que se me marcan en el filtro, no consigo dar con el problema.

¿Alguna idea?

Gracias

0voto

Yesod comentado

Mi idea era dejar solo pintadas las lineas que corresponen al filtro...

2 Respuestas

3votos

white Puntos75880

intentalo asi:

public Component getTableCellRendererComponent(JTable table,
      Object value,
      boolean isSelected,
      boolean hasFocus,
      int row,
      int column)
{
    JLabel cell = (JLabel) super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
    Calendar calendar = GregorianCalendar.getInstance();
    Date fecha = calendar.getTime();
    calendar.setTime(fecha);
    Date tiempo = calendar.getTime();
    SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd-MM-yyyy");
    Date fechapedido = null;
    String prueba = null;

    if (table.getColumnName(column).equals("FECHA DE ENTREGA"))
    {
        prueba = table.getValueAt(row, column).toString();

        try {
            fechapedido = formatoDeFecha.parse(prueba);
        } catch (ParseException e){
            e.printStackTrace();
        }

        int days = (int)( (tiempo.getTime() - fechapedido.getTime()) / (1000 * 60 * 60 * 24));

        System.out.print(prueba + " -- days: ");
        System.out.println(days);

        if (days >= 30)
        {
            cell.setBackground(Color.RED);
            return cell;
        }

    }

    cell.setBackground(Color.WHITE);
    return cell;
}

EDIT: para no dejarlo como teoría probe el código, y parece funcionar como entendi que querias lograrlo http://i.imgur.com/XMK4Zuv.png

0voto

Yesod comentado

He copiado y pegado tu código y me sale mas o menos:
http://www.anony.ws/image/DHvh
enter image description here

Lo que quiero es, que la fecha mas cercana a 30 días de hoy es decir, si estamos a 31/12/2014 - la fecha que salga marcada sea todo lo que este del 1/12/2014 hasta el 31/12/2014...que mas o menos a ti te sale, pero no se porque a mi no me recoge lo mismo...

EDITO: He dado con parte del problema que tenía, que era el formato, el problema que veo es que solo controla los días, pero no controla ni los meses ni el año...¿Alguna solucion?

0voto

white comentado

haber si entiendo, quieres marcar toda fecha que este entre 0 y 30 dias de atraso de acuerdo a la fecha actual?
si es asi bastaría con if (days >= 0 && days <= 30)

0voto

Yesod comentado

No me funciona... :(

Explico mejor: Si estoy a 27 de diciembre y tengo que entregar algo para el día 30, se marca
Si estoy a 27 de diciembre y tengo que entregar algo dentro de 2 meses, eso no se marca.

0voto

white comentado

entonces solo marcar si esta dentro del mes las dos fechas? (la actual y la de la tabla)

intenta asi y dime si es lo que quieres, me avisas cualquier cosa.

public Component getTableCellRendererComponent(JTable table,
      Object value,
      boolean isSelected,
      boolean hasFocus,
      int row,
      int column)
{
    JLabel cell = (JLabel) super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
    Calendar calendar = GregorianCalendar.getInstance();
    Date fecha = calendar.getTime();
    calendar.setTime(fecha);
    Date tiempo = calendar.getTime();
    SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd-MM-yyyy");
    Date fechapedido = null;
    String prueba = null;

    if (table.getColumnName(column).equals("FECHA DE ENTREGA"))
    {
        prueba = table.getValueAt(row, column).toString();

        try {
            fechapedido = formatoDeFecha.parse(prueba);
        } catch (ParseException e){
            e.printStackTrace();
        }

        int days = (int)( (tiempo.getTime() - fechapedido.getTime()) / (1000 * 60 * 60 * 24));

        Calendar pedidoCalendar = GregorianCalendar.getInstance();
        pedidoCalendar.setTime(fechapedido);
        int pedidoYear = pedidoCalendar.get(Calendar.YEAR);
        int pedidoMonth = pedidoCalendar.get(Calendar.MONTH) + 1;
        int pedidoMonthDay = pedidoCalendar.get(Calendar.DAY_OF_MONTH);
        int pedidoMonthDays = pedidoCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        boolean mark = false;

        if ((pedidoMonthDays - pedidoMonthDay) > 0 && (pedidoMonthDays - pedidoMonthDay) <= 30)
        {
            if
            (
                calendar.get(Calendar.YEAR) == pedidoYear &&
                pedidoMonth == calendar.get(Calendar.MONTH) + 1
            )
                mark = true;
        }

        if(mark)
        {
            cell.setBackground(Color.RED);
            return cell;
        }

    }

    cell.setBackground(Color.WHITE);
    return cell;
}

PD: solo para aclarar, el tiempo que va en las celdas de la tabla, es siempre futuro a la fecha actual? o varia y puede ser anterior o futuro?

0voto

Yesod comentado

En la base de datos, lo que se trata es de poner un condicionante, que es marcar en un color, la silla marcada con un nombre "Nº PROCESO" con la siguiente condición:

Si la "FECHA DE ENTREGA" es infrerior a 31 días con respecto a la actual, la casilla "Nª PROCESO" se marcará en color rojo.

http://www.anony.ws/image/DHI2
enter image description here

Disculpa por la confusión y muchas gracias por tu atención :D

0voto

white comentado

Reescribi el codigo, ahora marca filas de la columna "Nro proceso" solo si las filas de la columna "Fecha de entrega" tiene una fecha menor a 31 dias como maximo, antes de 31 dias no se marca, despues de la fecha actual no se marca, te deje el codigo con comentarios para que puedas hacer tus modificaciones y agregar mas opciones.

http://paste.ofcode.org/YyMvrF6aNT3Jn5BWsD2LMs

enter image description here

0voto

Yesod comentado

Es justamente lo que busco, pero no me marca nada...¿Tienes skype?

0voto

Peter comentado

@Yesod, la solución se da en el sitio y así le sirve a otros usuarios. Pedir soporte en privado y en exclusiva para ti por medio de Skype no es lo correcto.

Saludos.

0voto

Yesod comentado

Perdona, es que necesité algo mas de ayuda y algo de soporte online por skype, por eso se lo pedí.
Adjunto la solución:

public class MyCellRenderer extends DefaultTableCellRenderer {
    private List<Integer> markedRows = new ArrayList<Integer>();
    private static final long serialVersionUID = 1L;
    public Component getTableCellRendererComponent(JTable table,
          Object value,
          boolean isSelected,
          boolean hasFocus,
          int row,
          int column)
    {
        super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);

        if (table.getColumnName(column).equals("FECHA DE ENTREGA"))
        {
            Calendar calendar = GregorianCalendar.getInstance();
            Date fecha = calendar.getTime();
            calendar.setTime(fecha);
            SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd-MM-yyyy");
            Date fechapedido = null;
            String cellDate = null; // la fecha de la celda
            cellDate = table.getValueAt(row, column).toString(); // obtenemos el valor de la celda (ejm: 25-12-2014)

            // intentamos hacer un parse a la fecha de la celda,
            // usar try es necesario solo si la celda no va a tener un formato correcto. lo dejo asi.
            try {
                fechapedido = formatoDeFecha.parse(cellDate);
            } catch (ParseException e){
                e.printStackTrace();
            }

            // restamos la fecha del pedido con la fecha actual y obtenemos el total de dias | 60 seconds = 1 minuto, etc. etc
            int days = (int)( (fechapedido.getTime() - fecha.getTime()) / (1000 * 60 * 60 * 24));

            if(fechapedido.getTime() >= fecha.getTime() || fechapedido.getTime() <= fecha.getTime())
            {
                // si la fecha de la celda es anterior a 31 dias maximo
                if(days >= 0 && days <= 30)
                {
                    // si en la lista no existe esa fila, la agregamos
                    if(markedRows.indexOf(row) == -1)
                        markedRows.add(row);
                }
                // si la fecha de la celda es justo hoy dia... D:
                else if(days == 0)
                {}
            }
        }

        // una vez obtenido las filas ( row ) con la fecha deseada desde la columna "Fecha entrega",
        // los pintamos en la columna "Nro proceso"
        //String columnName = table.getColumnName(column).toLowerCase();
        // System.out.println("'" + columnName + "' (" + columnName.length() + ")");

        if(table.getColumnName(column).indexOf("Nº PROCESO") != -1 || table.getColumnName(column).indexOf("FECHA DE ENTREGA") != -1)
        {
            System.out.println(markedRows.size());
            // si la fila actual esta en la lista de filas marcadas la pintamos de rojo
            if(markedRows.indexOf(row) != -1)
            {
                System.out.println("hola"); //--ENTRA HASTA AQUI
                // pintar celdas de la columna "Nro proceso"
                if(table.getColumnName(column).indexOf("Nº PROCESO") != -1) //if(columnName.indexOf("proceso") != -1)
                {
                    System.out.println("probando...");
                    this.setBackground(new Color(238, 67, 67)); //#EE4343 rojo claro ^^
                    this.setForeground(new Color(119, 19, 19)); // #771313 rojo oscuro :P
                }

                // OPCIONAL: pintar las celdas de la columna "Fecha de entrega"
                else if(table.getColumnName(column).indexOf("FECHA DE ENTREGA") != -1)
                {
                    //this.setBackground(Color.CYAN);
                    //this.setForeground(Color.BLUE
                    this.setBackground(new Color(238, 67, 67));
                    this.setForeground(new Color(119, 19, 19));
                }

                return this;
            }
        }

        // a todas las celdas restantes les damos un color y fondo por defecto, la tabla se edita constantemente
        // una opcion podria ser stopCellEditing();
        this.setBackground(Color.WHITE);
        this.setForeground(Color.BLACK);

        return this;
    }
}

2votos

LxDAndromeda Puntos2440

Utilizas i para contar las columnas y a para contar las filas. Por lo tanto vamos a crear un objeto para seleccionar la celda:

Object celda = (object) tb1.getValueAt(a, i);

o:

String celda = (String) tb1.getValueAt(a,i);

Y si no:

DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
Date fechaCelda = tb1.getValueAt(a, i);      
String celda = df.format(fechaCelda);

y luego vamos a cambiar:

cell.setBackground(Color.ORANGE);
cell.setBackground(Color.BLACK);

por:

celda.setBackground(Color.ORANGE);
celda.setBackground(Color.BLACK);

0voto

Yesod comentado

Y entonces en esos valores que sobran, ¿que puedo poner? Si pongo "null" me deja vacia esa parte...

0voto

LxDAndromeda comentado

Para seleccionar una celda utiliza:

Object NOMBREOBJETO = NOMBRETABLA.getValueAt(NUMEROFILA, NUMEROCOLUMNA);

0voto

Yesod comentado

Mi idea era dejar pintadas las lineas que se corresponen con el filtro...

0voto

Yesod comentado

El problema es que no quiero comparar una fecha con otra, quiero comparar si la fecha que hay es inferior a las fechas recogidas por el rango de 30 días.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta