Bonne rencontre,

J’essaie désespérément de récupérer le résultat d’une query dans une JTable. J’essaie également de faire de la DAO mais je ne pense pas que c’est la source de mon problème.

Je mets le résultat de ma query dans mon model mais quand j’attache celui-ci à ma table, c’est la catastrophe. Je reçois ce message :

IWAV0052E Invocation Target Exception creating be.roose.vue.DesktopChambreListe
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.eclipse.ve.internal.java.vce.launcher.remotevm.JFCLauncher$1.run(JFCLauncher.java:59)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at be.roose.vue.DesktopChambreListe.<init>(DesktopChambreListe.java:72)
... 13 more
Je me suis inspiré du code présent sur cette page :

http://www.rgagnon.com/javadetails/java-0309.html

Ma classe vue : (Je mets en gras le code qui me semble poser problème)

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package be.roose.vue;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import be.roose.connexion.ConnexionDB;
import be.roose.connexion.DbParametre;
import be.roose.model.ChambreDAO;
import be.roose.model.ChambreDAOImpl;

public class DesktopChambreListe extends JInternalFrame implements ActionListener{
	
    private JPanel monPanel = new JPanel();
    private GridBagConstraints gbc = new GridBagConstraints();
    private JScrollPane maScrollPane;
    private JTable maTable;
    private String[] tableColumnsName = {"ID","Numero Chambre","Numero Tel","Libre"};  
    private JLabel numeroChambreLabel = new JLabel("Numero de Chambre");
    private JLabel telChambreLabel = new JLabel("Tel chambre");
    private JLabel libreChambreLabel = new JLabel("Libre");
    private JTextField numeroChambreField = new JTextField();
    private JTextField telChambreField = new JTextField();
    private JComboBox libreChambreCombo = new JComboBox();
    private JButton quitterBouton = new JButton("Quitter");
    private JButton rafraichirBouton = new JButton("Rafraichir");
    private JButton nouveauBouton = new JButton("Nouveau");
    private JButton supprimerBouton = new JButton("Supprimer");
	
	public DesktopChambreListe(){
		this.setTitle("Liste des Chambres");
		this.setClosable(true);
		this.setResizable(true);
		this.setSize(790, 500);
		this.setVisible(true);
		System.out.println("Chambre!");

		// On récupére les informations de la base de donnée pour établir la connexion
	   	ConnexionDB dbConf = new ConnexionDB();
	   	DbParametre dbParametre = null;
    	try {
    		dbParametre=dbConf.processProperties();
		} catch (IOException e1) {
			e1.printStackTrace();
			System.exit(1);
		}
		if (dbParametre == null) {
			System.out.println("Pas d'information sur la DB!");
			System.exit(1);
		}
		ChambreDAO chambreDAO = new ChambreDAOImpl(dbParametre);
		
		// Méthode pour obtenir les enregistements
		chambreDAO.scanAllChambreDB();
//		DefaultTableModel monModel = (DefaultTableModel) maTable.getModel();
		DefaultTableModel monModel = new DefaultTableModel();
		monModel.setColumnIdentifiers(tableColumnsName);
		monModel.addRow(chambreDAO.getData());
		this.maTable.setModel(monModel);
		maScrollPane = new JScrollPane(maTable);
		
		// On défnit la combo
		libreChambreCombo.addItem("Oui");
		libreChambreCombo.addItem("Non");
		
		// On définit le Grid
		
		monPanel.setLayout(new GridBagLayout());
		
		// On place les Label
		
		gbc.fill = GridBagConstraints.BOTH;
		gbc.insets = new Insets (10,10,10,10);
		
		gbc.gridx = 0;
		gbc.gridy = 6;
		monPanel.add(numeroChambreLabel,gbc);
		gbc.gridx = 0;
		gbc.gridy = 7;
		monPanel.add(telChambreLabel,gbc);
		gbc.gridx = 0;
		gbc.gridy = 8;
		monPanel.add(libreChambreLabel,gbc);

		// On place les TextField
		
		gbc.gridx = 1;
		gbc.gridy = 6;
		gbc.weightx=50;
		monPanel.add(numeroChambreField,gbc);
		gbc.gridx = 1;
		gbc.gridy = 7;
		monPanel.add(telChambreField,gbc);
		gbc.gridx = 1;
		gbc.gridy = 8;
		monPanel.add(libreChambreCombo,gbc);
		
		// On place les boutons
		gbc.weightx=0;
		gbc.weighty=0;
		gbc.gridx = 2;
		gbc.gridy = 9;
		monPanel.add(nouveauBouton,gbc);
		gbc.gridx = 3;
		gbc.gridy = 9;
		monPanel.add(supprimerBouton,gbc);
		gbc.gridx = 4;
		gbc.gridy = 9;
		monPanel.add(rafraichirBouton,gbc);
		gbc.gridx = 5;
		gbc.gridy = 9;
		monPanel.add(quitterBouton,gbc);
		
		// On place la table
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.gridwidth = 6;
		gbc.gridheight = 6;
		gbc.weightx=100;
		gbc.weighty=100;
		monPanel.add(maScrollPane,gbc);
		
		// On attache monPanel
		this.getContentPane().add(monPanel);
		
		// Ecouteur
		
		quitterBouton.addActionListener(this);
		
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		// On ferme la JInternalFrame
		this.dispose();

	}

}
Ma classe DAOImpl

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package be.roose.model;
 
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
 
import be.roose.connexion.DbParametre;
import be.roose.query.MesQuery;
 
 
public class ChambreDAOImpl implements ChambreDAO {
 
	/** Connexion à la base de données */
	private Connection connexion;
	/** Statement pour les query */
	private Statement statement;
	/** Results of the scanning of the database */
	private ResultSet resultSet;	
	/** Parameters to access the database */
	private DbParametre dbParametre;
	/** Parametre de la query */
	private MesQuery maQuery;
	/** Objet qui contient les résultats de la table */
	private Object[]data;
 
 
 
	/** Constructeur de base */
	public ChambreDAOImpl() {
		throw new UnsupportedOperationException(
				"Pour avoir accès au DB, les paramètres sont nécessaires ");
	}
 
	/** constructeur qui reçoit les paramètres de la base */
	public ChambreDAOImpl(DbParametre dbParametre) {
		this.dbParametre = dbParametre;
		maQuery = new MesQuery("CHAMBRE");
	}
 
	@Override
	public void deleteChambreDB(ChambreTO chambre) {
		// TODO Auto-generated method stub
 
	}
	@Override
	public void insertChambreDB(ChambreTO chambre) {
		// TODO Auto-generated method stub
 
	}
	@Override
	public void scanAllChambreDB() {
		try {
			Class.forName(dbParametre.getProtocol()).newInstance();
        	connexion=DriverManager.getConnection(dbParametre.getUrldb()
        		 , dbParametre.getUser(), dbParametre.getPassword());
        	statement=connexion.createStatement();
        	resultSet=statement.executeQuery(maQuery.voirTable());       
        	ResultSetMetaData rsmd = resultSet.getMetaData();
        	int colNo = rsmd.getColumnCount();
        	while(resultSet.next()){
        	 Object[] data = new Object[colNo];
        	 for(int i=0;i<colNo;i++){
        		 data[i]=resultSet.getObject(i+1);
        		 System.out.println(data[i]);
        	  }
        	}
 
        } catch (InstantiationException e) {
            e.printStackTrace();
        	System.out.println("1");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        	System.out.println("2");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        	System.out.println("3");
         } 
        catch (SQLException e) {
            e.printStackTrace();
        	System.out.println("4");
         }
 
        finally {
        	try {
				connexion.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
        	try {
				statement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
        }
	}
 
	public Object[] getData() {
		return data;
	}
 
 
	@Override
	public void updateChambreDB(ChambreTO chambre) {
		// TODO Auto-generated method stub
 
	}
 
 
}
Ma classe ConnexionDB qui va lire les informations de connexion dans un fichier

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
package be.roose.connexion;
 
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
 
public class ConnexionDB {
 
	/** Default Constructor */
	public ConnexionDB() {}
 
	/**
         * Configuration des paramètres pour la base de données
         * @throws IOException si le fichier n'est pas trouvé
         */
	public DbParametre processProperties() throws IOException {
   	 	Properties properties = new Properties();
		FileInputStream fileInputStream = new FileInputStream("conf/connection.properties");
		properties.load(fileInputStream);
		DbParametre dbParametre = new DbParametre();
		dbParametre.setUser((String) properties.getProperty("User"));
		dbParametre.setPassword((String) properties.getProperty("Password"));
		dbParametre.setUrldb((String) properties.getProperty("Urldb"));
		dbParametre.setProtocol((String) properties.getProperty("Protocol"));
		return dbParametre;
	}
 
}
Ma classe DbParametre qui sert a établir la connexion

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
package be.roose.connexion;
 
public class DbParametre {
	/** Protocol de la base de données      */
	private String protocol;
	/** url de la base de données   */
	private String urldb;
	/** utilisateur de la base de données   */
	private String user;
	/** Mot de passe de la base de données  */
	private String password;
 
//	public DbParametre(){}
 
	public String getProtocol() {
		return protocol;
	}
 
	public void setProtocol(String protocol) {
		this.protocol = protocol;
	}
 
	public String getUrldb() {
		return urldb;
	}
 
	public void setUrldb(String urldb) {
		this.urldb = urldb;
	}
 
	public String getUser() {
		return user;
	}
 
	public void setUser(String user) {
		this.user = user;
	}
 
	public String getPassword() {
		return password;
	}
 
	public void setPassword(String password) {
		this.password = password;
	}
 
	public String toString() {
		// On utilise StringBuffer pour éviter les instanciation a répétition
		StringBuffer stringBuffer = new StringBuffer();
		stringBuffer.append("Address DB:" + getUrldb() + "/");
		stringBuffer.append("User to access DB:" + getUser() + "/");
		stringBuffer.append("Password to access DB:" + getPassword() + "/");
		stringBuffer.append("Protocol to access DB:" + getProtocol() + "/");
		return stringBuffer.toString();
	}
 
}
Un grand merci d’avance,
Raphaël.

PS : Si vous avez des conseils pour améliorer mon code, je suis preneur. J’ai souvent l’impression que ma formation de base n’est pas assez solide et que je programme n’importe comment… Enfin, j'ai surtout ce sentiment en Java et c'est très frustrant.