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 :
Je me suis inspiré du code présent sur cette page :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
http://www.rgagnon.com/javadetails/java-0309.html
Ma classe vue : (Je mets en gras le code qui me semble poser problème)
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
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 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
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 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 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; } }
Un grand merci d’avance,
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(); } }
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.
Partager