Java JTable changer la couleur de la cellule


Je voudrais créer une table modifiable, puis vérifier les données pour m'assurer qu'elles sont valides. Je ne sais pas comment changer la couleur d'une seule cellule. Je voudrais obtenir une cellule, par exemple (0,0) et colorer le premier plan en rouge. J'ai lu les autres messages sur SO ainsi que Oracle sur le ColorRenderer personnalisé, mais je ne comprends tout simplement pas comment je l'utiliserais.

Merci.

Author: kleopatra, 2011-04-15

6 answers

Dites que la cellule que vous souhaitez rendre avec une couleur différente représente un statut (je prendrai Rejeté et approuvé comme exemples). J'implémenterais ensuite une méthode dans mon modèle de table appelée getStatus (int row) qui renvoie l'état pour n'importe quelle ligne donnée.

Ensuite, lorsque cela est en place, je vais créer un moteur de rendu de cellule responsable du rendu de la colonne à laquelle la cellule appartient. Le moteur de rendu de cellule serait quelque chose dans les lignes du code ci-dessous.

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;

}

Alors, quand le moteur de rendu est en place, il suffit d ' "appliquer" le moteur de rendu à la table avec le morceau de code suivant:

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

En ce qui concerne la modification d'une cellule, implémentez simplement la méthode isCellEditable (int rowIndex, int columnIndex) dans votre modèle de table. Vous devez également implémenter la méthode setValueAt (Object value, int rowIndex, int columnIndex) si vous souhaitez conserver la valeur fournie par l'utilisateur (ce que je suppose que vous faites!).

 18
Author: sbrattla, 2011-04-15 07:23:51

Je voudrais créer une table modifiable, puis vérifier les données pour m'assurer qu'elles sont valides.

Une autre approche consisterait à modifier les données avant qu'elles ne soient enregistrées dans le modèle de table pour empêcher la saisie de données non valides.

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);
    }
}
 2
Author: camickr, 2011-04-15 16:08:18

Le moyen le plus simple est d'écrire un simple TableCellRenderer en étendant le DefaultTableCellRenderer et écraser la méthode getTableCellRendererComponent en setBackground( Color.RED ). Par exemple:

final JTable table = new JTable(...);
table.setCellRenderer( new DefaultTableCellRenderer() {
    public Component getTableCellRenderer(JTable table, Object value, ...) {
        super.getTableCellRenderer(...);

        if ( value should be highlighted ) {
            setBackground( Color.RED );
        }
        return this;
    }
});
 1
Author: Nate W., 2011-04-15 07:25:01

C'est le moyen le plus simple de colorer une colonne ou une cellule particulière dans un jTable.

Tout d'abord, créez simplement une classe simple de CustomRenderer

class CustomRenderer extends DefaultTableCellRenderer <br />
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        setForeground(Color.blue); >
        return c;
    }
}

Ce code obtient la colonne de la cellule pour rendre

TableColumn col = tblExamHistoryAll.getColumnModel().getColumn(5);
DefaultTableModel model3 = (DefaultTableModel)tblExamHistoryAll.getModel();
col.setCellRenderer(new CustomRenderer());

Ceci permet d'effacer toutes les lignes précédentes de votre table. Si vous ne les voulez pas, supprimez simplement ces lignes

model3.getDataVector().removeAllElements();
model3.fireTableDataChanged();
 1
Author: Abdul Jabbar WebBestow, 2012-11-24 22:21:20

Je crois que la bonne façon de faire de la coloration dans une table est via un ColorHighlighter. Les moteurs de rendu de table ont des problèmes pour rendre différentes couleurs dans la même colonne.

Voici un exemple d'utilisation des surligneurs. Dans ce cas, c'est pour mettre en évidence une cellule qui n'est pas modifiable.

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

}

Puis dans votre code pour configurer la table, vous ajoutez le surligneur et ses paramètres de couleur:

 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);
 1
Author: Mateva, 2015-05-25 16:32:13
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int col) {
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
    int control = row;
    control = control % 2;
    control = (control == 0) ? 1 : 0;
    if (control == 1) {
        c.setBackground(Color.green);
    } else {
        c.setBackground(Color.cyan);
    }
    return c;
}
 0
Author: carlos ortiz, 2018-06-14 06:07:18