Bonjour,

Je sais que mon problème a déjà été posté plusieurs fois sur ce forum pour avoir lu plusieurs posts à ce sujet, mais aucune des réponses ne semble convenir au problème qu'il se pose pour moi.

J'ai une JTable dans un JPanel qui a un modèle que je définis également.
A la création du panel, je remplis automatiquement ma JTable et tout se passe très bien. Elle est composée des fichiers se trouvant dans un dossier et d'information les concernant. La table est remplie comme il faut, je peux double cliquer sur les lignes et les actions que j'ai défini se passent nickel... sauf sur un détail.
La dernière colonne de ma table permet, via une petite image qui a un listener de défini, d'effacer la ligne sur laquelle se trouve la petite image si l'utilisateur clique dessus.

J'ai essayé deux choses principales mais aucune d'elle ne fonctionne et me rendent deux résultats différents :
1/ la méthode "propre" :
Je passe tout simplement par les méthodes remove proposées. Mais cela ne fonctionne pas. La ligne n'est pas supprimée. Si j'essaye de cliquer à nouveau dessus, cela fait comme si la ligne existait toujours et que je n'avais fait strictement aucune modification. Le getRowSelected() rend la bonne valeur.

2/ j'essaye de réinitialiser ma JTable
Ici j'affecte de nouveau ma JTable de la même manière que je l'ai créée si je clique sur "supprimer". La ligne se supprime effectivement (encore heureux qu'il ne trouve pas le fichier qui a été supprimé en reparcourant le répertoire :p ), mais ensuite, impossible de sélectionner une seule des lignes de ma table, le getSelectedRow() me renvoie toujours -1.


Voici le code de mes classes :

Le panel qui contient la JTable :
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
public class Table extends JPanel {
	private RowListener rl;
	protected static String rscPath = ...;
	protected static File [] mesFichiers=null;
 
	// dimensions de la table
	protected static Object[][] data=null;
	protected static String[] columnNames={... noms des colonnes ...};
 
	protected static DataTable table;
 
	public Table(int width, int height) {
		super(new GridLayout(1,0));
		this.setPreferredSize(new Dimension(width,height));
 
		// init du rowListener qui définit les évènements user sur la table
		rl=new RowListener(this);
 
		initTable();
 
		JScrollPane scrollPane = new JScrollPane(table);
		add(scrollPane);
	}
 
	/**
         * Parcours le dossier des ressources disponibles 
         */
	public File[] findFiles(String path) {
		...
		//parcours du dossier : rien de bien passionnant ^^
		...
	}
 
	/**
         * @param numero : numéro de la ligne sur laquelle se trouve le fichier dans la table pour lequel on a demandé la suppression
         */
	public void deleteFile(int numero) {
		// suppresion effective du pc de l'utilisateur du fichier sélectionné
		new File(rscPath+mesFichiers[numero].getName()).delete();
 
		// suppression de la liste "mes fichiers" qui sert à remplir la table
		mesFichiers[numero].delete();
 
		// on réinitialise la table : cas 1 dans mon explication
		// pour le cas 2 : je vire les 4 lignes qui suivent et je remplace par initTable()
		table.removeRowSelectionInterval(numero, numero);
		table.model.fireTableRowsDeleted(numero, numero);
		table.model.fireTableDataChanged();
		table.revalidate();
 
		repaint();
	}
 
	public void initTable(){
		String nomFichier;
 
		// on recense tous les fichiers dans le répertoire rscPath 
		mesFichiers=findFiles(rscPath);
		data=new Object[mesFichiers.length][columnNames.length];
 
		// on parse chaque fichier et on remplie les lignes que l'on mettra dans la Table
		for (int i=0; i<mesFichiers.length;i++) {
			...
			// boucle qui remplie le champ data
			...
		}
 
		// création de la table avec le model associé
		table=new DataTable(getAbstractModel(), rl);
 
		repaint();
	}
 
 
	/**
         * Permet de définir l'abstract model de la table
         * @return retourne le modèle de la table
         */
	public static AbstractTableModel getAbstractModel(){
 
		return new AbstractTableModel() {
			public int getColumnCount() { return columnNames.length; }
			public int getRowCount()    { return data.length; }
			public String getColumnName(int col) {
				return (String)columnNames[col]; 
			}
			public Object getValueAt(int row, int col) { 
				return data[row][col]; 
			}
			public Class getColumnClass(int col) {
				if (col==columnNames.length-1 || col==0)
					return ImageIcon.class;
				else return super.getColumnClass(col);
			}
		};
	}
}

Le RowListener qui permet d'écouter et de définir les actions des évènements souris :

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
 
public class RowListener implements MouseListener {
 
	static Table tablePan;
 
	public RowListener(Table table){
		this.tablePan=table;
	}
 
	public void mouseClicked(MouseEvent e) {
		if(tablePan.table.getSelectedColumn()==Table.columnNames.length-1) {
			// on a sélectionné un fichier à effacer
			if(JOptionPane.showConfirmDialog(null, LangParser.fichiersConfirmation)==0){
				// l'utilisateur a choisi l'option "oui", on supprime donc le fichier
				tablePan.deleteFile(tablePan.table.getSelectedRow());
			}
 
		}
	}
	public void mouseEntered(MouseEvent arg0) {}
	public void mouseExited(MouseEvent arg0) {}
	public void mousePressed(MouseEvent arg0) {}
	public void mouseReleased(MouseEvent arg0) {}	
}

Le code de la JTable :

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
 
public class DataTable extends JTable {
 
	AbstractTableModel model;
 
	public DataTable(AbstractTableModel model, RowListener rl) {
		super(model);
 
		this.model=model;
 
		// définition des propriétés de la table et construction de la table
		setPreferredScrollableViewportSize(new Dimension(500, 70));
		setFillsViewportHeight(true);
		setColumnSelectionAllowed(false);
		setShowVerticalLines(false);
		getTableHeader().setReorderingAllowed(false);
		setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		addMouseListener(rl);
	}
}

Je pense qu'il doit manquer un fireTable...quelque chose ou pas loin, mais je n'arrive pas à trouver.

Si quelqu'un a une idée, elle serait la bienvenue

Merci beaucoup par avance !

Bonne soirée