Bonjour !

Veuillez pardonner le pauvre noob que je suis, je crois m'être embarquer dans un projet au delà de mes capacités mais bon, c'est de cette manière que l'on apprend ! Mais la, j'ai un méga blocage !

J'ai fait mon programme et tout fonctionne super bien. Excepter un petit détail qui m'énerve. J'ai un Jtable avec un bouton me permettant de supprimer la ligne qui s'affiche dans la colonne 0. Lorsque j'appui sur les premières ligne du JTable, aucun problème, les choses se gate lors que j'appuis sur la dernière ligne du tableau. La ligne s'efface, sans problème sauf que le bouton reste la et il n'y a aucun moyen de supprimer aucune autre ligne. Il me donne un erreur "indice out of bound" a la ligne me permetant de supprimer la ligne ( .Remove(row)).

Il est a noté qu'à l'origine, mon tableau est vide et j'ajoute des ligne au besoin avec l'aide d'un bouton.

Voici mon code :


Main.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
static String [] title = {"X","Nom","SRM","Rend.","%","Kg",};
static Object[][] contenu;
static DefaultTableModel model1 = new DefaultTableModel(contenu, title);
static JTable tableauGrains = new JTable(model1);
 
tableauGrains.getColumn("X").setCellRenderer(new ButtonRenderer());
tableauGrains.getColumn("X").setCellEditor(new ButtonEditor(new JCheckBox()));
ButtonRenderer.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
import java.awt.Color;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
 
public class ButtonRenderer extends JButton implements TableCellRenderer{
 
    public Component getTableCellRendererComponent( JTable table, Object value,
                                                    boolean isSelected, boolean isFocus,
                                                    int row, int col) {
    	Color beige = new Color(218, 217, 158);
    	setBackground(beige);
        //On écrit dans le bouton ce que contient la cellule
        setText((value != null) ? value.toString() : "");
        //on retourne notre bouton
        return this;
    }
}
ButtonEditor.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
 
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
 
public class ButtonEditor extends DefaultCellEditor {
 
	protected JButton button;
	private DeleteButtonListener bListener = new DeleteButtonListener();
 
	/**
         * Constructeur avec une checkBox
         * @param checkBox
         * @param count
         */
	@SuppressWarnings("deprecation")
	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 précise le numéro de ligne à notre listener
		    bListener.setRow(row);
		    //Idem pour le numéro de colonne
		      //On passe aussi le tableau en paramètre 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;
		  }
 
	/**
         * Notre listener pour le bouton
         * @author CHerby
         *
         */
	  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
	            System.out.println("coucou du bouton: "+ ((JButton)event.getSource()).getText() );
	            ((DefaultTableModel)table.getModel()).removeRow(this.row);
                    ((DefaultTableModel)table.getModel()).fireTableDataChanged();
	          	         }
	      }
	   }        
	}
Voici des screens pour illustrer :

Le tableau de base ou lorsque je supprime une ligne autre que la dernière:
Nom : 1106.png
Affichages : 1195
Taille : 4,2 Ko


La tableau lorsque je clique sur le bouton de la dernière ligne:
Nom : 271.png
Affichages : 1225
Taille : 3,8 Ko


Après avoir supprimer la dernière ligne, le tableau lorsque je fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
System.out.println("New row Count: " + table.getRowCount());
le tableau "comprend" que j'ai supprimer un ligne mais le bouton de disparait pas, comme si l'affichage du tableau n'était pas rafraichit.

Je n'y comprend rien !!

Pouvez vous m'aider ou je suis définitivement trop dans la mélasse ?

Merci beaucoup d'avance !!!

Djosimd