2010-11-11 8 views
4

Ceci est mon code pour rendre un JTable et changer la couleur des lignes, mais il ne montre pas une case à cocher dans la colonne 6, seulement une chaîne (vrai, faux).Comment afficher une case à cocher dans une JTable?

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

Voici le tableau:

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

ici est mon écran alt text

Répondre

3

Comme vous le savez probablement, JTable rendra les valeurs booléennes comme des cases à cocher pour vous. Je suppose que votre problème est que, dès la sortie de la boîte, vous ne pouvez pas définir de couleur d'arrière-plan personnalisée par ligne en fonction de critères spécifiques dans vos données. Vous pouvez créer un nouveau TableCellRenderer pour votre colonne boolean.

Vous avez un couple d'options:

  1. vous pouvez mettre un test dans votre moteur de rendu en cours pour déterminer si le value transmis est booléenne ou non, et le cas échéant, configurer une instance JCheckbox à renvoyer. Cela pourrait affecter ce que vous voulez, mais vous devrez faire attention, car votre moteur de rendu est souvent appelé et si vous créez un JCheckbox, il pourrait causer beaucoup de désabonnement.

  2. alternativement, vous pouvez créer une nouvelle TableCellRenderer qui s'étend JCheckbox (comme votre actuel étend JLabel. Vous voulez factoriser votre logique de coloration actuelle telle qu'elle pourrait être partagée entre les deux moteurs de rendu. Enfin, vous voulez associer ce moteur de rendu avec votre colonne. Vous pouvez le faire en définissant comme le moteur de rendu par défaut sur la table pour un certain Class (myTable.setDefaultRenderer(Class, TableCellRenderer)), ou le définir comme le moteur de rendu pour une colonne spécifique (myTable.getColumnModel().getColumn(int).setCellRenderer(TableCellRenderer))

7

La meilleure solution à ce problème est de mettre en œuvre votre propre TableModel (généralement par sous-classes AbstractTableModel) et implémentez la méthode getColumnClass(int) pour renvoyer Boolean.class pour la colonne que vous souhaitez afficher en tant que JCheckBox.

Il n'y a pas besoin de mettre en œuvre votre propre TableCellRenderer comme DefaultTableCellRenderer utilisé par JTable par défaut automatiquement rendre Boolean colonnes comme JCheckbox es.

+0

En effet, vous avez besoin de la case à cocher contenant un ID par exemple. Ensuite, vous devez utiliser customEditor & Renderer, ai-je raison? : D – gumuruh

+0

Oui, c'est correct. – Adamski

+0

Je suis toujours cette approche pour rendre les cases à cocher. – user613114

3

Merci akf i résolu en:

Ajouter une classe:

public class CheckBoxRenderer extends JCheckBox implements TableCellRenderer { 

      CheckBoxRenderer() { 
      setHorizontalAlignment(JLabel.CENTER); 
      } 

      public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int row, int column) { 
      if (isSelected) { 
       setForeground(table.getSelectionForeground()); 
       //super.setBackground(table.getSelectionBackground()); 
       setBackground(table.getSelectionBackground()); 
      } else { 
       setForeground(table.getForeground()); 
       setBackground(table.getBackground()); 
      } 
      setSelected((value != null && ((Boolean) value).booleanValue())); 
      return this; 
      } 
} 

Modifier constructeur de MYTABLE:

public MyJTable(DefaultTableModel md) 
    { 
    super(md); 
    CheckBoxRenderer checkBoxRenderer = new CheckBoxRenderer(); 
    this.getColumnModel().getColumn(6).setCellRenderer(checkBoxRenderer); 
    } 
1

Je trouve plus facile à utiliser l'approche Table Row Rendering quelque chose comme ça. Cela fonctionnera sans créer de moteurs de rendu individuels pour chaque colonne.

Questions connexes