Comment rendre une case à cocher dans un JTable?
C'est mon code afin de le rendre un JTable et changer la couleur des lignes, mais il ne montre pas une case à cocher dans la colonne 6, seule chaîne (vrai,faux).
Pouvez-vous fournir une solution pour résoudre ce problème?
Merci d'avance.
public class JLabelRenderer extends JLabel implements TableCellRenderer
{
private MyJTable myTable;
/**
* Creates a Custom JLabel Cell Renderer
* @param t your JTable implmentation that holds the Hashtable to inquire for
* rows and colors to paint.
*/
public JLabelRenderer(MyJTable t)
{
this.myTable = t;
}
/**
* Returns the component used for drawing the cell. This method is
* used to configure the renderer appropriately before drawing.
* see TableCellRenderer.getTableCellRendererComponent(...); for more comments on the method
*/
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
setOpaque(true); //JLabel isn't opaque by default
setText(value.toString());
setFont(myTable.getFont());
if(!isSelected)//if the row is not selected then use the custom color
setBackground(myTable.getRowToPaint(row));
else //if the row is selected use the default selection color
setBackground(myTable.getSelectionBackground());
//Foreground could be changed using another Hashtable...
setForeground(myTable.getForeground());
//Since the renderer is a component, return itself
return this;
}
//The following methods override the defaults for performance reasons
public void validate() {}
public void revalidate() {}
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}
C'est la table:
import javax.swing.JTable;
import javax.swing.table.*;
import java.util.Hashtable;
import java.awt.Color;
public class MyJTable extends JTable
{
Hashtable rowsToPaint = new Hashtable(1);
/**
* Default Constructor
*/
public MyJTable()
{
super();
}
/**
* Set the TableModel and then render each column with a custom cell renderer
* @param tm TableModel
*/
public void setModel(TableModel tm)
{
super.setModel(tm);
renderColumns(new JLabelRenderer(this));
}
/**
* Add a new entry indicating:
* @param row the row to paint - the first row = 0;
* @param bgColor background color
*/
public void addRowToPaint(int row, Color bgColor)
{
rowsToPaint.put(new Integer(row), bgColor);
this.repaint();//you need to repaint the table for each you put in the hashtable.
}
/**
* Returns the user selected BG Color or default BG Color.
* @param row the row to paint
* @return Color BG Color selected by the user for the row
*/
public Color getRowToPaint(int row)
{
Color bgColor = (Color)rowsToPaint.get(new Integer(row));
return (bgColor != null)?bgColor:getBackground();
}
/**
* Render all columns with the specified cell renderer
* @param cellRender TableCellRenderer
*/
public void renderColumns(TableCellRenderer cellRender)
{
for(int i=0; i<this.getModel().getColumnCount(); i++)
{
renderColumn(this.getColumnModel().getColumn(i), cellRender);
}
}
/**
* Render a TableColumn with the sepecified Cell Renderer
* @param col TableColumn
* @param cellRender TableCellRenderer
*/
public void renderColumn(TableColumn col, TableCellRenderer cellRender)
{
try{
col.setCellRenderer(cellRender);
}catch(Exception e){System.err.println("Error rendering column: [HeaderValue]: "+col.getHeaderValue().toString()+" [Identifier]: "+col.getIdentifier().toString());}
}
}
voici mon écran
OriginalL'auteur tiendv | 2010-11-11
Vous devez vous connecter pour publier un commentaire.
Comme vous le savez probablement, JTable rendra valeurs booléennes que des cases à cocher pour vous. Je pense que votre problème est que, hors de la boîte, vous ne pouvez pas personnaliser la couleur de fond par ligne en fonction de critères spécifiques dans vos données. Vous pouvez créer un nouveau
TableCellRenderer
pour votreboolean
colonne.Vous avez deux options:
vous pouvez mettre un test dans votre moteur de rendu pour déterminer si le
value
transmis est booléen ou non, et si oui, configurer unJCheckbox
instance à être retourné. Cela pourrait en effet ce que vous voulez, mais vous devez être prudent, car votre convertisseur est appelé souvent et si vous créez un arrêtJCheckbox
es, il pourrait causer beaucoup de désabonnement.alternativement, vous pouvez créer un nouveau
TableCellRenderer
qui s'étendJCheckbox
(tout comme votre actuelle s'étendJLabel
. Vous voulez refactoriser votre coloration de la logique telle qu'elle pourrait être partagé entre les deux convertisseurs. Enfin, vous souhaitez associer ce convertisseur avec votre colonne. Vous pouvez soit le faire par le définir comme le moteur de rendu par défaut sur la table pendant un certainClass
(myTable.setDefaultRenderer(Class, TableCellRenderer)
), ou le définir comme le moteur de rendu pour une colonne spécifique (myTable.getColumnModel().getColumn(int).setCellRenderer(TableCellRenderer)
)OriginalL'auteur akf
La meilleure solution à ce problème est de mettre en place votre propre
TableModel
(typiquement par un sous-classement parAbstractTableModel
) et de mettre en œuvre lagetColumnClass(int)
méthode pour retournerBoolean.class
pour la colonne que vous souhaitez rendre unJCheckBox
.Il n'est pas nécessaire de mettre en place votre propre
TableCellRenderer
comme leDefaultTableCellRenderer
utilisé parJTable
par défaut sera automatiquement renduBoolean
colonnesJCheckbox
es.Oui, c'est correct.
J'ai toujours suivi cette approche pour rendre les cases à cocher.
OriginalL'auteur Adamski
Grâce akf je l'ai résolu en :
ajouter une classe :
Modifier constructeur de Mytable:
OriginalL'auteur tiendv
Je le trouve plus facile à utiliser la Ligne De Tableau De Rendu approche pour quelque chose comme ça. Il fonctionnera sans créer des moteurs de rendu pour chaque colonne.
OriginalL'auteur camickr