OVH Cloud OVH Cloud

JTABLE !!! de l aide SVP!!!! urgent

7 réponses
Avatar
louka
salut, au fait je veux creer un tableau JTABLE qui recup=E8re le
resultat de deux requetes:
je m explique : il faut que j'ai dans le tableau une colonne issu d'une
table "etudiant" et les autres colonnes des "titres" des mati=E8res
etudi=E9s pourque je puisse faire un etat =E0 la fin!
le prol=E8me c'est que quand j execute la seconde requetes, le resultat
de la prem=E8re est effac=E9!!
et je meretrouve avec une seule partie!

7 réponses

Avatar
alexandre cartapanis
salut, au fait je veux creer un tableau JTABLE qui recupère le
resultat de deux requetes:
je m explique : il faut que j'ai dans le tableau une colonne issu d'une
table "etudiant" et les autres colonnes des "titres" des matières
etudiés pourque je puisse faire un etat à la fin!
le prolème c'est que quand j execute la seconde requetes, le resulta t
de la premère est effacé!!
et je meretrouve avec une seule partie!



Heu pourrais tu être plus explicite stp? éventuellement nous montrer le
code qui foire...

Parce que la on ne sais pas si c'est ta requête, le résultat de la
requête ou la table elle même qui est effacé... Et pis qu'entends t u par
"requête", un requête SQL? Dans ce cas quel est le rapport avec JTabl e?

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email

Avatar
louka
merci pour cette reponse si vite, je m explique
je recupère le resultat d'une requete SQL depuis une base access pour
le moment.
je dois avoir une colonne portant le ID des etudiants et dans les
colonnes qui suit les noms des matières etudiés pour pouvoir mettre
à jour le nombre d'absence dans chaque matières

String requete="SELECT CD_ETU FROM ETDIANT ;";
String requete="SELECT CD_MAT from MATIERE WHERE semestre=1; ";

mais moi j'arrive à executer qu'une seule requetes au fait c'est la
première vici une vue sur le code :


import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import javax.swing.event.TableModelEvent;

/**
* @author dt_web
* @since 09.01.2006
*
* cette classe permet en plus de l'affichage d'une base de donnée
access
* dans une JTable de l'actualiser par l'envoi de requête sql.
* je me suis servi pour cela de la classe JDBCAdapter.java
* que j'ai emprunté dans la section du
jdk1.5.0_06demojfcTableExample
*
*/
public class testJTable {

public static void main (String[] args){
// constructeur principal
new principale();

}

}

class principale extends JFrame implements MouseListener{

private static final int x = 500;
private static final int y = 500;
private JTree tree;
private JLabel celluleclic;
public JPanel panel = new JPanel(new BorderLayout());
public JTable table = new JTable();
public JScrollPane JSP = new JScrollPane(table);

public JMenu jMenu_Etudiant = new JMenu();
public JTextField textRequete;
public DefaultMutableTreeNode root, node1, node2, node3;


// définition de l'instance du modèle de données.
// héritant de la classe AbstractTableModel
JDBCAdapter dataBase;

// définitions des paramètres de connexion....
String pilote = "sun.jdbc.odbc.JdbcOdbcDriver";//DRIVER
String host = "jdbc:odbc:ecole; ";//PATH
String login = "";// USER
String pw = "";//PASSWORD
//String requete="SELECT CD_ETU FROM ETDIANT ;";
String requete="SELECT CD_MAT from MATIERE WHERE semestre=1; ";

// Constructeur....
public principale(){


BorderLayout borderLayout1 = new BorderLayout();
panel = (JPanel) this.getContentPane();
panel.setLayout(borderLayout1);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(x,y);
this.setTitle("
" +
" ESTI ABSENCE ");
jMenu_Etudiant.setMnemonic('E');
jMenu_Etudiant.setText("MENU");
JMenuBar jMenuBar1 = new JMenuBar();
jMenuBar1.add(jMenu_Etudiant);
this.setJMenuBar(jMenuBar1);
/* une arboresence de JTREE pour chercher
le groupe le depart la classe de l'etudiant*/

root = new DefaultMutableTreeNode("ESTI", true);
node1 = new DefaultMutableTreeNode("node 1", true);
node2 = new DefaultMutableTreeNode("node 2" , true);
node3 = new DefaultMutableTreeNode("node 3" , true);
root.add(node1);
node1.add(node2);
root.add(node3);
tree=new JTree(root);
tree.setPreferredSize(new Dimension(100,y));
panel.add(tree,BorderLayout.WEST);
JSP.setPreferredSize(new Dimension(x,y));
panel.add(JSP,BorderLayout.CENTER);




// création du modèle de données.
// suivant le paramètres de connection
// à la base de donnée Access.
dataBase = new JDBCAdapter(
pilote,
host,
login,
pw);

// exécution de la requete sql
// (et initialisatin du modele de données)
dataBase.executeQuery(requete);
// affectation du modèle à la JTable
this.table.setModel(dataBase);
////////////////////////////////////////
/*pour modifier le contenu d'une cellule et mettre à jour la base en
meme temps*/
this.table.addMouseListener (this);
this.celluleclic = new JLabel (" ligne : colonne : ");
this.getContentPane ().add (this.celluleclic, BorderLayout.SOUTH);


///////////////////////////////


pack();
show();

}

public void mouseClicked(MouseEvent e) {
Point p = e.getPoint ();
int colonne = this.table.columnAtPoint (p)+1;
int ligne = this.table.rowAtPoint (p)+1;

// si la souris n'a pas clic sur une cellule :
if ( (0 == colonne) || (0 == ligne) )
{
this.celluleclic.setText (" Pas de Cellule selectionée ");
}
else
{
this.celluleclic.setText (" ligne : "+ligne+" colonne :
"+colonne);
while(true){
Object value=this.table.getValueAt(ligne,colonne);
this.table.setValueAt(value,ligne,colonne);}
//this.table.editCellAt(row, col);
//this.table.getEditorComponent().requestFocus();
}

}

public void mouseExited (MouseEvent e) { }
public void mousePressed (MouseEvent e) { }
public void mouseReleased (MouseEvent e) { }
public void mouseEntered (MouseEvent e) { }

// écouteur du champ textRequete (détecte un Return )
public void actionPerformed(ActionEvent e) {
if (e.getSource() == node1) System.out.println("b1............");
if (e.getSource() == node2) System.out.println("b2............");
if (e.getSource() == node3) System.out.println("b3............");
if (e.getSource().equals(textRequete )) {

dataBase.executeQuery(textRequete .getText());

System.out.println("requete............");
}
}
}


Si tu me propose une autre manière de travail au liue de JTABLE
n'h"site surtout pas pourvu que je termine cette partie l me reste du
travail!

c'est pour mon projet de fin d'etude et je galère déjà :(

merci infiniment!
Avatar
alexandre cartapanis
merci pour cette reponse si vite, je m explique
je recupère le resultat d'une requete SQL depuis une base access pour
le moment.
je dois avoir une colonne portant le ID des etudiants et dans les
colonnes qui suit les noms des matières etudiés pour pouvoir mettre
à jour le nombre d'absence dans chaque matières

String requete="SELECT CD_ETU FROM ETDIANT ;";
String requete="SELECT CD_MAT from MATIERE WHERE semestre=1; ";

mais moi j'arrive à executer qu'une seule requetes au fait c'est la
première vici une vue sur le code :


import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import javax.swing.event.TableModelEvent;

/**
* @author dt_web
* @since 09.01.2006
*
* cette classe permet en plus de l'affichage d'une base de donnée
access
* dans une JTable de l'actualiser par l'envoi de requête sql.
* je me suis servi pour cela de la classe JDBCAdapter.java
* que j'ai emprunté dans la section du
jdk1.5.0_06demojfcTableExample
*
*/
public class testJTable {

public static void main (String[] args){
// constructeur principal
new principale();

}

}

class principale extends JFrame implements MouseListener{

private static final int x = 500;
private static final int y = 500;
private JTree tree;
private JLabel celluleclic;
public JPanel panel = new JPanel(new BorderLayout());
public JTable table = new JTable();
public JScrollPane JSP = new JScrollPane(table);

public JMenu jMenu_Etudiant = new JMenu();
public JTextField textRequete;
public DefaultMutableTreeNode root, node1, node2, node3;


// définition de l'instance du modèle de données.
// héritant de la classe AbstractTableModel
JDBCAdapter dataBase;

// définitions des paramètres de connexion....
String pilote = "sun.jdbc.odbc.JdbcOdbcDriver";//DRIVER
String host = "jdbc:odbc:ecole; ";//PATH
String login = "";// USER
String pw = "";//PASSWORD
//String requete="SELECT CD_ETU FROM ETDIANT ;";
String requete="SELECT CD_MAT from MATIERE WHERE semestre=1; ";

// Constructeur....
public principale(){


BorderLayout borderLayout1 = new BorderLayout();
panel = (JPanel) this.getContentPane();
panel.setLayout(borderLayout1);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(x,y);
this.setTitle("
" +
" ESTI ABSENCE ");
jMenu_Etudiant.setMnemonic('E');
jMenu_Etudiant.setText("MENU");
JMenuBar jMenuBar1 = new JMenuBar();
jMenuBar1.add(jMenu_Etudiant);
this.setJMenuBar(jMenuBar1);
/* une arboresence de JTREE pour chercher
le groupe le depart la classe de l'etudiant*/

root = new DefaultMutableTreeNode("ESTI", true);
node1 = new DefaultMutableTreeNode("node 1", true);
node2 = new DefaultMutableTreeNode("node 2" , true);
node3 = new DefaultMutableTreeNode("node 3" , true);
root.add(node1);
node1.add(node2);
root.add(node3);
tree=new JTree(root);
tree.setPreferredSize(new Dimension(100,y));
panel.add(tree,BorderLayout.WEST);
JSP.setPreferredSize(new Dimension(x,y));
panel.add(JSP,BorderLayout.CENTER);




// création du modèle de données.
// suivant le paramètres de connection
// à la base de donnée Access.
dataBase = new JDBCAdapter(
pilote,
host,
login,
pw);

// exécution de la requete sql
// (et initialisatin du modele de données)
dataBase.executeQuery(requete);
// affectation du modèle à la JTable
this.table.setModel(dataBase);
////////////////////////////////////////
/*pour modifier le contenu d'une cellule et mettre à jour la base en
meme temps*/
this.table.addMouseListener (this);
this.celluleclic = new JLabel (" ligne : colonne : ");
this.getContentPane ().add (this.celluleclic, BorderLayout.SOUTH);


///////////////////////////////


pack();
show();

}

public void mouseClicked(MouseEvent e) {
Point p = e.getPoint ();
int colonne = this.table.columnAtPoint (p)+1;
int ligne = this.table.rowAtPoint (p)+1;

// si la souris n'a pas clic sur une cellule :
if ( (0 == colonne) || (0 == ligne) )
{
this.celluleclic.setText (" Pas de Cellule selectionée ");
}
else
{
this.celluleclic.setText (" ligne : "+ligne+" colonne :
"+colonne);
while(true){
Object value=this.table.getValueAt(ligne,colonne);
this.table.setValueAt(value,ligne,colonne);}
//this.table.editCellAt(row, col);
//this.table.getEditorComponent().requestFocus();
}

}

public void mouseExited (MouseEvent e) { }
public void mousePressed (MouseEvent e) { }
public void mouseReleased (MouseEvent e) { }
public void mouseEntered (MouseEvent e) { }

// écouteur du champ textRequete (détecte un Return )
public void actionPerformed(ActionEvent e) {
if (e.getSource() == node1) System.out.println("b1............");
if (e.getSource() == node2) System.out.println("b2............" );
if (e.getSource() == node3) System.out.println("b3............" );
if (e.getSource().equals(textRequete )) {

dataBase.executeQuery(textRequete .getText());

System.out.println("requete............");
}
}
}


Si tu me propose une autre manière de travail au liue de JTABLE
n'h"site surtout pas pourvu que je termine cette partie l me reste du
travail!

c'est pour mon projet de fin d'etude et je galère déjà :(

merci infiniment!




Alors je ne suis pas sur, mais essaye de "closer" le JDBCAdapter pour voi r:

dataBase = new JDBCAdapter(pilote, host, login, pw);

// exécution de la requete sql
// (et initialisatin du modele de données)
dataBase.executeQuery(requete);

//FERMETURE
dataBase.close();
//!FERMETURE

// affectation du modèle à la JTable
this.table.setModel(dataBase);

Ca fais longtemps que je n'ai plus fais de JDBC (hibernate-powered) mais
je crois que y'avais une histoire comme quoi fallait fermer le statement
ou la connexion...

Si ça ne résoud rien dis le moi.

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email

Avatar
louka
re, eh ben rien!
je sais pas pourquoi je ne peux executer qu'une seule requete et donc
n'avoir qu'une seule partie de la JTABLE dont j'ai besoin :(

je sais plus quoi faire...

propse quelque chose si tu veux bien
Avatar
David JOURAND
JDBCAdapter semble être un modèle unidimensionnel (vu la requête), alors
que le tableau est bidimensionnel... Il faut un modèle correspondant à
ce qui va être affiché. Je ne sais pas si c'est le modèle qui est à
revoir (le code n'est pas fourni) ou la requête...

Si les requêtes SQL ne font que récupérer les ID des étudiants d'une
part et les matières d'autre part, le modèle (JDBCAdapter) est à
revoir.
Si les requêtes SQL récupère l'ensemble des notes des étudiants pour
chaque matières, c'est la requête qui est à revoir...

--
David Jourand
Avatar
louka
au fait c'est la première suggestion qui est la bonne
"les requêtes SQL ne font que récupérer les ID des étudiants d'une
part et les matières d'autre part"

mais moi je pense que mon modèle JDBCX n'est pas mal au contraire je
crois qu'il correspond bien à mon prb:
le voilà :

/*
* @(#)JDBCAdapter.java 1.16 04/07/26
*
* Copyright (c) 2004 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
are met:
*
* -Redistribution of source code must retain the above copyright
notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright
notice,
* this list of conditions and the following disclaimer in the
documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of
contributors may
* be used to endorse or promote products derived from this software
without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC.
("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY
LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE
THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS
SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or
intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/

/*
* @(#)JDBCAdapter.java 1.16 04/07/26
*/

/**
* An adaptor, transforming the JDBC interface to the TableModel
interface.
*
* @version 1.20 09/25/97
* @author Philip Milne
*/

import java.util.Vector;
import java.sql.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.event.TableModelEvent;

public class JDBCAdapter extends AbstractTableModel {
Connection connection;
Statement statement;
ResultSet resultSet;
String[] columnNames = {};
Vector rows = new Vector();
ResultSetMetaData metaData;

public JDBCAdapter(String driverName,String url,
String user, String passwd) {
try {
Class.forName(driverName);
System.out.println("Opening db connection");

connection = DriverManager.getConnection(url, user, passwd);
//statement = connection.createStatement();
statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
}
catch (ClassNotFoundException ex) {
System.err.println("Cannot find the database driver classes.");
System.err.println(ex);
}
catch (SQLException ex) {
System.err.println("Cannot connect to this database.");
System.err.println(ex);
}
}
public void executeQuery(String query) {
if (connection == null || statement == null) {
System.err.println("There is no database to execute the query.");
return;
}
try {
resultSet = statement.executeQuery(query);
metaData = resultSet.getMetaData();

int numberOfColumns = metaData.getColumnCount();
columnNames = new String[numberOfColumns];
// Get the column names and cache them.
// Then we can close the connection.
for(int column = 0; column < numberOfColumns; column++) {
columnNames[column] = metaData.getColumnLabel(column+1);
}

// Get all rows.
rows = new Vector();
while (resultSet.next()) {
Vector newRow = new Vector();
for (int i = 1; i <= getColumnCount(); i++) {
newRow.addElement(resultSet.getObject(i));
}
rows.addElement(newRow);
}
// close(); Need to copy the metaData, bug in jdbc:odbc driver.
fireTableChanged(null); // Tell the listeners a new table has
arrived.
}
catch (SQLException ex) {
System.err.println(ex);
}
}

public void close() throws SQLException {
System.out.println("Closing db connection");
resultSet.close();
statement.close();
connection.close();
}

protected void finalize() throws Throwable {
close();
super.finalize();
}

//////////////////////////////////////////////////////////////////////////
//
// Implementation of the TableModel Interface
//
//////////////////////////////////////////////////////////////////////////

// MetaData

public String getColumnName(int column) {
if (columnNames[column] != null) {
return columnNames[column];
} else {
return "";
}
}


public Class getColumnClass(int column) {
int type;
try {
type = metaData.getColumnType(column+1);
}
catch (SQLException e) {
return super.getColumnClass(column);
}

switch(type) {
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
return String.class;

case Types.BIT:
return Boolean.class;

case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
return Integer.class;

case Types.BIGINT:
return Long.class;

case Types.FLOAT:
case Types.DOUBLE:
return Double.class;

case Types.DATE:
return java.sql.Date.class;

default:
return Object.class;
}
}

public boolean isCellEditable(int row, int column) {
/*try {
return metaData.isWritable(column+1);
}
catch (SQLException e) {
return false;
}*/
return true;
}

public int getColumnCount() {
return columnNames.length;
}

// Data methods

public int getRowCount() {
return rows.size();
}

public Object getValueAt(int aRow, int aColumn) {
Vector row = (Vector)rows.elementAt(aRow);
return row.elementAt(aColumn);
}

public String dbRepresentation(int column, Object value) {
int type;

if (value == null) {
return "null";
}

try {
type = metaData.getColumnType(column+1);
}
catch (SQLException e) {
return value.toString();
}

switch(type) {
case Types.INTEGER:
case Types.DOUBLE:
case Types.FLOAT:
return value.toString();
case Types.BIT:
return ((Boolean)value).booleanValue() ? "1" : "0";
case Types.DATE:
return value.toString(); // This will need some conversion.
default:
return """+value.toString()+""";
}

}

public void setValueAt(Object value, int row, int column) {
try {
String tableName = metaData.getTableName(column+1);
// Some of the drivers seem buggy, tableName should not be null.
if (tableName == null) {
System.out.println("Table name returned null.");
}
String columnName = getColumnName(column);
String query =
"update "+tableName+
" set "+columnName+" = "+dbRepresentation(column, value)+
" where ";
// We don't have a model of the schema so we don't know the
// primary keys or which columns to lock on. To demonstrate
// that editing is possible, we'll just lock on everything.
for(int col = 0; col<getColumnCount(); col++) {
String colName = getColumnName(col);
if (colName.equals("")) {
continue;
}
if (col != 0) {
query = query + " and ";
}
query = query + colName +" = "+
dbRepresentation(col, getValueAt(row, col));
}
System.out.println(query);
System.out.println("Not sending update to database");
statement.executeQuery(query);
}
catch (SQLException e) {
// e.printStackTrace();
System.err.println("Update failed");
}
Vector dataRow = (Vector)rows.elementAt(row);
dataRow.setElementAt(value, column);

}
}
Avatar
David JOURAND
au fait c'est la première suggestion qui est la bonne
"les requêtes SQL ne font que récupérer les ID des étudiants d'une
part et les matières d'autre part"

mais moi je pense que mon modèle JDBCX n'est pas mal au contraire je
crois qu'il correspond bien à mon prb:


Je ne pense pas... Dans ce modèle les titres des colonnes (vos matières
sont des méta données de la requête (nom des champs de la table).

Ce modèle attend une requête correspondant à un tableau bidimensionnel !
Faites votre propre modèle.

--
David Jourand