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
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
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
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:
La tableau lorsque je clique sur le bouton de la dernière ligne:
Après avoir supprimer la dernière ligne, le tableau lorsque je fais :
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
Partager