J'aimerais créer une table modifiable, puis vérifier les données pour s'assurer de leur validité. Je ne suis pas sûr de savoir 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 articles sur SO ainsi qu'Oracle sur le ColorRenderer personnalisé, mais je ne comprends tout simplement pas comment je l'emploierais.
Merci.
Dites que la cellule que vous souhaitez afficher avec une couleur différente représente un statut (je prendrai comme exemples Rejected et Approved). J'implémentais ensuite une méthode dans mon modèle de table appelée getStatus (int row), qui renvoie le statut d'une ligne donnée.
Ensuite, lorsque cela est en place, je créerais un moteur de rendu de cellule chargé de restituer la colonne à laquelle appartient la cellule. Le 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;
}
Ensuite, lorsque le moteur de rendu est en place, il suffit "d'appliquer" le moteur de rendu à la table avec le code suivant:
Table.getColumnModel().getColumn(columnIndex).setCellRenderer(new StatusColumnCellRenderer());
Pour rendre une cellule modifiable, 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!).
J'aimerais créer une table modifiable, puis vérifier les données pour s'assurer de leur validité.
Une autre approche consisterait à modifier les données avant de les enregistrer 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);
}
}
Je pense que la manière correcte de colorer une table consiste à utiliser une variable ColorHighlighter
. Les rendus 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, il s’agit de mettre en évidence une cellule non 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);
}
}
ensuite, dans votre code de configuration de la table, 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);
La méthode la plus simple consiste à écrire une TableCellRenderer
simple en étendant la méthode DefaultTableCellRenderer
et en écrasant 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;
}
});
C’est le moyen le plus simple de colorer une colonne ou une cellule particulière dans un jTable.
Commencez par créer une simple classe 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 à rendre
TableColumn col = tblExamHistoryAll.getColumnModel().getColumn(5);
DefaultTableModel model3 = (DefaultTableModel)tblExamHistoryAll.getModel();
col.setCellRenderer(new CustomRenderer());
Ceci est pour effacer toutes les lignes précédentes de votre table. Si vous ne les voulez pas, supprimez ces lignes
model3.getDataVector().removeAllElements();
model3.fireTableDataChanged();
@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;
}