Code web 433848

Fenetre.java


//CTRL + SHIFT + O pour générer les imports
public class Fenetre extends JFrame {

   private JTable tableau;
   private JButton change = new JButton("Changer la taille");
   private String[] comboData = {"Très bien", "Bien", "Mal"};
   private String supp = "Supprimer la ligne";
   private JComboBox combo;
   
   public Fenetre(){
      this.setLocationRelativeTo(null);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setTitle("JTable");
      this.setSize(600, 250);
      this.createContent();
   }
   
   private void createContent(){
      //Données de notre tableau
      Object[][] data = {   
         {"Cysboy", "6boy", comboData[0], new Boolean(true), supp},
         {"BZHHydde", "BZH", comboData[0], new Boolean(false), supp},
         {"IamBow", "BoW", comboData[0], new Boolean(false), supp},
         {"FunMan", "Year", comboData[0], new Boolean(true), supp}
      };

      String  title[] = {"Pseudo", "Age", "Taille", "OK ?", "Suppression"};
      combo = new JComboBox(comboData);
      
      //Notre modèle d'affichage spécifique destiné à pallier 
      //les bugs d'affichage !
      ZModel zModel = new ZModel(data, title);
      
      this.tableau = new JTable(zModel);      
      this.tableau.setRowHeight(30);
      this.tableau.getColumn("Age").setCellRenderer(new ButtonRenderer());
      this.tableau.getColumn("Age").setCellEditor(new ButtonEditor(new JCheckBox()));
      
      //On définit l'éditeur par défaut pour la cellule 
      //en lui spécifiant quel type d'affichage prendre en compte
      this.tableau.getColumn("Taille").setCellEditor(new DefaultCellEditor(combo));
      DefaultTableCellRenderer dcr = new DefaultTableCellRenderer();
      this.tableau.getColumn("Taille").setCellRenderer(dcr);
      
      //On définit un éditeur pour la colonne "supprimer"
      this.tableau.getColumn("Suppression").setCellEditor(new DeleteButtonEditor(new JCheckBox()));
      
      //On ajoute le tableau
      this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER);
      
      JButton ajouter = new JButton("Ajouter une ligne");
      ajouter.addActionListener(new MoreListener());
      this.getContentPane().add(ajouter, BorderLayout.SOUTH);
   }      
   
   class MoreListener implements ActionListener{
      public void actionPerformed(ActionEvent event) {
         Object[] donnee = new Object[]
            {"Angelo", "Rennais", comboData[0], new Boolean(false), supp};
         ((ZModel)tableau.getModel()).addRow(donnee);
      }
   }
      
   public static void main(String[] args){
      Fenetre fen = new Fenetre();
      fen.setVisible(true);
   }
}


ZModel.java


class ZModel extends AbstractTableModel{

   private Object[][] data;
   private String[] title;
   
   //Constructeur
   public ZModel(Object[][] data, String[] title){
      this.data = data;
      this.title = title;
   }
   
   //Retourne le titre de la colonne à l'indice spécifié
   public String getColumnName(int col) {
     return this.title[col];
   }

   //Retourne le nombre de colonnes
   public int getColumnCount() {
      return this.title.length;
   }
   
   //Retourne le nombre de lignes
   public int getRowCount() {
      return this.data.length;
   }
   
   //Retourne la valeur à l'emplacement spécifié
   public Object getValueAt(int row, int col) {
      return this.data[row][col];
   }
   
   //Définit la valeur à l'emplacement spécifié
   public void setValueAt(Object value, int row, int col) {
      //On interdit la modification sur certaines colonnes !
      if(!this.getColumnName(col).equals("Age") 
         && !this.getColumnName(col).equals("Suppression"))
         this.data[row][col] = value;
   }
         
  //Retourne la classe de la donnée de la colonne
   public Class getColumnClass(int col){
      //On retourne le type de la cellule à la colonne demandée
      //On se moque de la ligne puisque les données sont les mêmes
      //On choisit donc la première ligne
      return this.data[0][col].getClass();
   }

   //Méthode permettant de retirer une ligne du tableau
   public void removeRow(int position){
      
      int indice = 0, indice2 = 0;
      nbRow = this.getRowCount()-1, nbCol = this.getColumnCount();
      Object temp[][] = new Object[nbRow][nbCol];
      
      for(Object[] value : this.data){
         if(indice != position){
            temp[indice2++] = value;
         }
         System.out.println("Indice = " + indice);
         indice++;
      }
      this.data = temp;
      temp = null;
      //Cette méthode permet d'avertir le tableau que les données 
      //ont été modifiées, ce qui permet une mise à jour complète du tableau
      this.fireTableDataChanged();
   }
   
   //Permet d'ajouter une ligne dans le tableau
   public void addRow(Object[] data){
      int indice = 0, nbRow = this.getRowCount(), nbCol = this.getColumnCount();
      
      Object temp[][] = this.data;
      this.data = new Object[nbRow+1][nbCol];
      
      for(Object[] value : temp)
         this.data[indice++] = value;
      
         
      this.data[indice] = data;
      temp = null;
      //Cette méthode permet d'avertir le tableau que les données 
      //ont été modifiées, ce qui permet une mise à jour complète du tableau
      this.fireTableDataChanged();
   }
   
   
   public boolean isCellEditable(int row, int col){
      return true;
   }
}


ButtonRenderer.java


//CTRL + SHIFT + O pour générer les imports
public class ButtonRenderer extends JButton implements TableCellRenderer{

   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean isFocus, int row, int col) {
      //On écrit dans le bouton avec la valeur de la cellule
      setText((value != null) ? value.toString() : "");
      //On retourne notre bouton
      return this;
   }
}


ButtonEditor.java


//CTRL + SHIFT + O pour générer les imports
public class ButtonEditor extends DefaultCellEditor {
     
   protected JButton button;
   private ButtonListener bListener = new ButtonListener();
   
   public ButtonEditor(JCheckBox checkBox) {
      //Par défaut, ce type d'objet travaille avec un JCheckBox
      super(checkBox);
       //On crée à nouveau notre bouton
      button = new JButton();
       button.setOpaque(true);
       //On lui attribue un listener
       button.addActionListener(bListener);
   }

   public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column){ 
      //On définit le numéro de ligne à notre listener
      bListener.setRow(row);
      //Idem pour le numéro de colonne
      bListener.setColumn(column);
      //On passe aussi en paramètre le tableau pour des actions potentielles
      bListener.setTable(table);
      //On réaffecte le libellé au bouton
      button.setText( (value ==null) ? "" : value.toString() );
      //On renvoie le bouton
       return button;
   }
   
   class ButtonListener implements ActionListener {
     
     private int column, row;
     private JTable table;
     private int nbre = 0;
     private JButton button;
     
     public void setColumn(int col){this.column = col;}
     public void setRow(int row){this.row = row;}
     public void setTable(JTable table){this.table = table;}
     public JButton getButton(){return this.button;}
     
     public void actionPerformed(ActionEvent event) {
      //On affiche un message mais vous pourriez faire ce que vous voulez
      System.out.println("coucou du bouton : "+
         ((JButton)event.getSource()).getText() );
      //On affecte un nouveau libellé à une celulle de la ligne
      ((AbstractTableModel)table.getModel()).setValueAt("New Value " + (++nbre), this.row, (this.column -1));   
      //Permet de dire à notre tableau qu'une valeur a changé 
      //à l'emplacement déterminé par les valeurs passées en paramètres
      ((AbstractTableModel)table.getModel()).fireTableCellUpdated(this.row, this.column - 1);
      this.button = ((JButton)event.getSource());
     }
  }
}


DeleteButtonEditor.java


//CTRL + SHIFT + O pour générer les imports
public class DeleteButtonEditor extends DefaultCellEditor {
     
   protected JButton button;
   private DeleteButtonListener bListener = new DeleteButtonListener();
   
   public DeleteButtonEditor(JCheckBox checkBox) {
      //Par défaut, ce type d'objet travaille avec un JCheckBox
      super(checkBox);
       //On crée à nouveau notre bouton
      button = new JButton();
       button.setOpaque(true);
       //On lui attribue un listener
       button.addActionListener(bListener);
   }

   public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      //On définit le numéro de ligne à notre listener
      bListener.setRow(row);
      //On passe aussi en paramètre le tableau pour des actions potentielles
      bListener.setTable(table);
      //On réaffecte le libellé au bouton
      button.setText( (value ==null) ? "" : value.toString() );
      //On renvoie le bouton
       return button;
   }
   
   class DeleteButtonListener implements ActionListener {
        
        private int row;
        private JTable table;
        
        public void setRow(int row){this.row = row;}
        public void setTable(JTable table){this.table = table;}
        
        public void actionPerformed(ActionEvent event) {
         if(table.getRowCount() > 0){
            //On affiche un message mais vous pourriez faire ce que vous voulez
            System.out.println("coucou du bouton : "+ ((JButton)event.getSource()).getText() );
            //On affecte un nouveau libellé à une celulle de la ligne
            ((ZModel)table.getModel()).removeRow(this.row);
            
         }
      }
   }         
}


ComboRenderer.java


//CTRL + SHIFT + O pour générer les imports
public class ComboRenderer extends JComboBox implements TableCellRenderer {

   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean isFocus, int row, int col) {
      
      this.addItem("Très bien");
      this.addItem("Bien");
      this.addItem("Mal");
      return this;