Jtable avec model + Dao + resultSet
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 :
Citation:
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:
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:
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:
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:
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.