Saltar al contenido

Java JTable cambiar el color de la celda

Esta es la solución más completa que encomtrarás compartir, pero primero mírala pausadamente y valora si se puede adaptar a tu proyecto.

Solución:

Digamos que la celda que le gustaría renderizar con un color diferente representa un estado (tomaré Rechazado y Aprobado como ejemplos). Luego implementaría un método en mi modelo de tabla llamado getStatus (int row) que devuelve el estado de cualquier fila dada.

Luego, cuando eso esté en su lugar, me gustaría crear un renderizador de celda responsable de representar la columna a la que pertenece la celda. El renderizador de celda sería algo en las líneas del siguiente código.

public class StatusColumnCellRenderer extends DefaultTableCellRenderer {
  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) 

    //Cells are by default rendered as a JLabel.
    JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);

    //Get the status for the current row.
    CustomTableModel tableModel = (CustomTableModel) table.getModel();
    if (tableModel.getStatus(row) == CustomTableModel.APPROVED) 
      l.setBackground(Color.GREEN);
     else 
      l.setBackground(Color.RED);
    

  //Return the JLabel which renders the cell.
  return l;


Luego, cuando el renderizador esté en su lugar, simplemente “aplique” el renderizador a la tabla con el siguiente fragmento de código:

Table.getColumnModel().getColumn(columnIndex).setCellRenderer(new StatusColumnCellRenderer());

Con respecto a hacer que una celda sea editable, simplemente implemente el método isCellEditable (int rowIndex, int columnIndex) en su modelo de tabla. También debe implementar el método setValueAt (Object value, int rowIndex, int columnIndex) si desea mantener el valor que proporciona el usuario (¡lo que supongo que sí!).

Me gustaría hacer una tabla editable y luego verificar los datos para asegurarme de que sean válidos.

Otro enfoque sería editar los datos antes de guardarlos en el modelo de tabla para evitar que se ingresen datos no válidos.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableEdit extends JFrame

    TableEdit()
    
        JTable table = new JTable(5,5);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollpane = new JScrollPane(table);
        getContentPane().add(scrollpane);

        //  Use a custom editor

        TableCellEditor fce = new FiveCharacterEditor();
        table.setDefaultEditor(Object.class, fce);
    

    class FiveCharacterEditor extends DefaultCellEditor
    
        FiveCharacterEditor()
        
            super( new JTextField() );
        

        public boolean stopCellEditing()
        
            try
            
                String editingValue = (String)getCellEditorValue();

                if(editingValue.length() != 5)
                
                    JTextField textField = (JTextField)getComponent();
                    textField.setBorder(new LineBorder(Color.red));
                    textField.selectAll();
                    textField.requestFocusInWindow();

                    JOptionPane.showMessageDialog(
                        null,
                        "Please enter string with 5 letters.",
                        "Alert!",JOptionPane.ERROR_MESSAGE);
                    return false;
                
            
            catch(ClassCastException exception)
            
                return false;
            

            return super.stopCellEditing();
        

        public Component getTableCellEditorComponent(
            JTable table, Object value, boolean isSelected, int row, int column)
        
            Component c = super.getTableCellEditorComponent(
                table, value, isSelected, row, column);
            ((JComponent)c).setBorder(new LineBorder(Color.black));

            return c;
        

    

    public static void main(String [] args)
    
        JFrame frame = new TableEdit();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    

Creo que la forma correcta de colorear una tabla es a través de un ColorHighlighter. Los renderizadores de tablas tienen problemas para renderizar diferentes colores en la misma columna.

A continuación, se muestra un ejemplo de cómo utilizar resaltadores. En este caso es para resaltar una celda que no es editable.

public class IsCellEditablePredicate implements HighlightPredicate 

   private JXTable table;

   public IsCellEditablePredicate (final JXTable table) 
       this.table = table;
   

   @Override
   public boolean isHighlighted(Component component, ComponentAdapter componentAdapter) 

        return !table.isCellEditable(componentAdapter.row,
          componentAdapter.column);
   

y luego, en su código para configurar la tabla, agrega el resaltador y sus parámetros de color:

 ColorHighlighter grayHighlighter = new ColorHighlighter(new IsCellEditablePredicate(table));

    grayHighlighter.setBackground(Color.LIGHT_GRAY);
    grayHighlighter.setForeground(table.getForeground());
    grayHighlighter.setSelectedBackground(table.getSelectionBackground().darker());
    grayHighlighter.setSelectedForeground(table.getSelectionForeground().darker());

    table.setHighlighters(grayHighlighter);

Reseñas y puntuaciones

Si tienes alguna desconfianza y forma de progresar nuestro post te invitamos escribir un informe y con mucho placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *