Bonjour,

Je suis novice sur java et tente désespérément de finir un TP. La problématique est la suivante :
Je dois afficher le contenu d'une table de ma BDD dans une JTable (jusque là pas de problème) mais je dois rafraîchir l'affichage de cette JTable dans ma frame principale lorsque j'effectue une opération dans la BDD (et là ça se complique).

Le bout de code que je n'arrive pas à faire fonctionner est le suivant :
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
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
 
import fr.ocr.sql.AbstractDAOFactory;
import fr.ocr.sql.DAO;
import fr.ocr.sql.DAOTableFactory;
import fr.ocr.sql.DatabaseTable;
import fr.ocr.sql.HsqldbConnection;
import voiture.Vehicule;
 
//Notre listener pour le bouton
public class ButtonListener implements ActionListener {
	protected int column, row, id;
	protected JTable table;
 
	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 void actionPerformed(ActionEvent event) {
		//Test le contnu de la JTable avant suppression de la ligne
		for(int i = 0; i < table.getRowCount(); i++) {
			String ligne = "";
			for(int j = 0; j < table.getColumnCount(); j++) {
				ligne += table.getValueAt(i, j).toString().trim() + "\t|\t";
			}
			System.out.println(ligne);
		}
		System.out.println("*******************************************************************"
				+ "**********************************************");
		id = Integer.parseInt((String) table.getValueAt(this.row, this.column - 2));
		AbstractDAOFactory aDAOFact = AbstractDAOFactory.getFactory(AbstractDAOFactory.DAO_FACTORY);
		DAO<Vehicule> vehiculeDAO = aDAOFact.getVehiculeDAO();
		Vehicule voiture = vehiculeDAO.find(id);
 
		int valid = JOptionPane.showConfirmDialog(null, "Êtes-vous sur de vouloir supprimer cette voiture ?"
				, "Supprimer", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
		if(valid != JOptionPane.NO_OPTION && valid != JOptionPane.CLOSED_OPTION) {
			vehiculeDAO.delete(voiture);
		}
		table = DAOTableFactory.getTable(HsqldbConnection.getInstance(), DatabaseTable.VEHICULE);
		//test le conetnu de la JTable après suppression de la ligne
		for(int i = 0; i < table.getRowCount(); i++) {
			String ligne = "";
			for(int j = 0; j < table.getColumnCount(); j++) {
				ligne += table.getValueAt(i, j).toString().trim() + "\t|\t";
			}
			System.out.println(ligne);
		}
		table.revalidate();
		table.repaint();
	}
}
Le test montre que le contenu de ma JTable a bien été modifié. En revanche dans ma frame rien.

Dans un autre ActionListener (lié à un autre bouton) j'ai utilisé le bout de code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
	frame.getContentPane().removeAll();
		frame.getContentPane().add(
			new JScrollPane(DAOTableFactory.getTable(
				HsqldbConnection.getInstance(), DatabaseTable.VEHICULE)),
				BorderLayout.CENTER);
		frame.getContentPane().revalidate();
Mais voilà (patatra), dans cette classe ButtonListener je n'ai pas accès à ma Frame ou autrement il faut écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
JFrame frame = (JFrame) table.getParent().getParent().getParent()... //Jusqu'à atteindre la frame
Ce code est absolument pas viable et optimiser et je pense qu'il existe des méthodes plus appropriées pour réaliser une actualisation de l'affichage.

Pouvez svp m'éclaircir sur ce que je devrais coder pour que ça fonctionne.

D'avance merci.