IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Ajouter une nouvelle ligne à une JTable lors d'une requete sql.


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut Ajouter une nouvelle ligne à une JTable lors d'une requete sql.
    Bonjour,

    j'ai écrit le code suivant qui me permet de modifier les données de la JTable a chaque fois que de nouvelles données parviennent au server-sql.
    Le soucis que j'ai, c'est que lorsque de nouvelles lignes apparaissent ma JTable ne les prend pas en compte.
    J'ai essayé de faire quelques modifs mais ça me donnait à chaque fois des exceptions.
    Comment est-ce qu'il faut que je modifie le code pour que des nouvelles lignes puisses être ajoutées à ma JTable lorsque c'est nécessaire.
    Merci

    Voici le code :
    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
    153
    import java.sql.Connection;
    import java.sql.Driver;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
     
    import sun.jdbc.odbc.JdbcOdbcDriver;
     
    public class MyTableModel4 extends AbstractTableModel{
    	static final long serialVersionUID = 1L;
    	String[] nomDesColonnes;
     
    	Object[][] donnees;
     
    	public MyTableModel4(ResultSet rs) throws SQLException{
    		ResultSetMetaData rsmd = rs.getMetaData();
    		int ncols = rsmd.getColumnCount();
    		nomDesColonnes = new String[ncols];
    		for(int i=1; i<=ncols; i++){
    			nomDesColonnes[i-1] = rsmd.getColumnLabel(i); 
    		}
    		rs.last();
    		int nlignes=rs.getRow();
    		//Remise du curseur à sa position initiale
    		rs.beforeFirst();
     
    		donnees = new String [nlignes][ncols];
     
    		boolean suivant = rs.next();
    		int k=0;
    		while(suivant){
    			for(int j=1; j<=ncols; j++){
    				donnees[k][j-1] = rs.getString(j);
    			}
    			suivant = rs.next();
    			k++;
    		}
    	}
     
    	/* retourne le nombre d'element de la colonne */
    	public int getColumnCount() {
    		return nomDesColonnes.length;
    	}
     
    	/* retourne le nombre d'elements de la ligne */
    	public int getRowCount() {
    		return donnees.length;
    	}
     
    	/* retourne le nom de la colonne */
    	public String getColumnName(int col) {
    		return nomDesColonnes[col];	
    	}
     
    	/* retourne la valeur à la ligne row et colonne col */
    	public Object getValueAt(int row, int col) {
    		return donnees[row][col];
    	}
     
    	/* retourne le type de chaque colonne */
    	public Class getColumnClass(int c) {
    		return getValueAt(0, c).getClass();
    	}
     
    	/* definie les cellules éditables ou non */
    	public boolean isCellEditable(int row, int col) {
    			return false;
    	}
     
    	/* permet de modifier l'element en placant value a la ligne row colonne col */
    	public void setValueAt(Object value, int row, int col) {
    		donnees[row][col] = value;
    		fireTableCellUpdated(row, col); // on signal un changement
    	}	
     
    	public static void main(String [] args){
    		//Parametre de connexion a la base de données
    		String url="jdbc:odbc:MAGIC";
        String login = "root";
        String password = "root";
        Connection connection = null;
    		try{
    			Driver monDriver = new JdbcOdbcDriver();
    			DriverManager.registerDriver(monDriver);	
    			connection=DriverManager.getConnection(url,login,password);
     
    			Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
     
    			String sql = "SELECT [Full Name] AS PERSONNE, "+
    	    "[GROUP Name] AS EQUIPE, "+  
           "SUM(CASE "+  
                  "WHEN [Seq.Assigned TO] = [Seq.Open BY] THEN 1 "+
                  "ELSE 0 "+
               "END) AS OUVERT, " +
    		"SUM(CASE "+  
                  "WHEN [Seq.Assigned TO] = [Seq.Closed BY] THEN 1 "+
                  "ELSE 0 "+
               "END) AS FERME, "+
    		"SUM(CASE "+
                  "WHEN [Seq.Open BY] = [Seq.Closed BY] THEN 1 "+
                  "ELSE 0 "+
               "END) AS [OUVERT & FERME] "+
     
        "FROM   MAGIC._SMDBA_.[Groups Details] G "+
           "INNER JOIN MAGIC._SMDBA_.Incident I "+
                 "ON I.[Seq.Assigned TO] = G.[Seq.SupportStaff] "+
     
        "WHERE (I.[Close Date & Time] BETWEEN '20070608 00:00:00.000' AND '20070608 19:00:00.000') "+
         "AND (I.[GROUP Name]='EHSFAC-SERVICEDESK1' OR I.[GROUP Name]='EHSFAC-SERVICEDESK2') "+
     
         "GROUP  BY [Full Name], [GROUP Name]";
     
    			ResultSet rs = stmt.executeQuery(sql);
     
    			MyTableModel4 myModel = new MyTableModel4(rs);
    			JTable table = new JTable(myModel);
    			JFrame frame = new JFrame("MyTableModel");
    			JScrollPane scroll = new JScrollPane(table);
    			frame.setSize(300,200);
    			frame.add(scroll);
    			frame.setVisible(true);
    			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    			while(true){
    				rs = stmt.executeQuery(sql);
    				boolean suivant = rs.next();
    				int k=0;
    				while(suivant){
    					while(k<myModel.getRowCount()){
    						for(int i=1; i<=myModel.getColumnCount(); i++){
    							myModel.setValueAt(rs.getString(i), k, i-1);
    							//myModel.setValueAt("random", k, i-1);
    						}
    						suivant = rs.next();
    						k++;
    						try {
    							Thread.sleep(2000);
    						}catch(InterruptedException ie){}
    					}
    				}
    			}
    		}catch(SQLException e){
    			e.printStackTrace();
    		}		
    	}
    }

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il te suffit de faire une méthode add() qui ajouterais une ligne dans le modèle (en renvoyant l'evenement qui va bien).
    Par contre j'utiliserais une List à la place d'un Object[][] pour les données : c'est plus facile à manipuler

    a++

  3. #3
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Je suis par sur, mais dans ton constructeur, le "fireXxxxxMachin" ne serait-il pas nécessaire ?

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iohack
    Je suis par sur, mais dans ton constructeur, le "fireXxxxxMachin" ne serait-il pas nécessaire ?
    Non ce n'est pas la peine... De toute manière comme l'objet n'est pas encore crée, aucune instance ne pourra s'enregistrer en tant que listener

    a++

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Il te suffit de faire une méthode add() qui ajouterais une ligne dans le modèle (en renvoyant l'evenement qui va bien).
    Par contre j'utiliserais une List à la place d'un Object[][] pour les données : c'est plus facile à manipuler

    a++
    Dans mon cas, il faudrait pouvoir ajouter et enlever des lignes suivant ce que donne la requete.
    Si la premiere requete donne 50 lignes, puis la 2de 5, la 3ème 15 etc ... il faudrait que la table subisse ces transformations.
    Que ce soit avec un tableau ou avec une liste, j'ai du mal à savoir comment m'y prendre.

  6. #6
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Points : 730
    Points
    730
    Par défaut
    Salut,

    Le plus simple c'est de faire comme la dit adiGuba faire une méthode avec une List pour manipuler les données de ton modèle.

    exemple :
    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
     
    ...
    JTable taTable = new JTable(new taTableModel());
     
    List<Object[]> listeDeDonnees = //tes donnees 
    ((taTableModel)taTable.getModel()).remplie(listeDeDonnees);
     
    ...
    //après tu vide
    ((taTableModel)taTable.getModel()).vide();
     
    List<Object[]> listeAutresDonnees = //d'autres donnees 
    ((taTableModel)taTable.getModel()).remplie(listeAutresDonnees);
     
    .......
     
     
     
     
    public class taTableModel extends AbstractTableModel{
     
    //ton constructeur vide 
    	public taTableModel(){}
     
    //des colonnes ca peux toujours servir
    	public static final int COLA = 0;
    	public static final int COLB = 1;
    	public static final int COLC = 2;
     
    	String[] colonnes = {"A","B","C"};
    //ta liste du contenu de ton tableau 
    	private List<Object[]> allLignes = new ArrayList<Object[]>();
     
    //le constructeur avec ta liste
    	public taTableModel(List<Object[]> allLignes){
    //test si la liste est vide rajouter une ligne vide
    		if (allLignes == null || allLignes.size()<1){
    			allLignes.add(new Object[colonnes.length]);
    		}
    		this.allLignes = allLignes;
    	}
     
    ....//tes différentes méthodes getvalueat, setValue, getRowCount etc...
     
    //Pour remplir ton tableau t'as juste besoin de 
     
    public void remplie(List<Object[]> lignes){
    		allLignes = lignes;
    	}
     
    //et tu peux meme vider ta table
    public void vide(){
    		allLignes.removeAll(allLignes);
    	}
     
    //...tout plein de trucs marrant ;) 
     
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut
    Salut,

    j'ai fait comme tu as indiqué mais j'ai encore un soucis.
    Dans le cas ou je ne fais qu'un seul affichage, cela fonctionne mais dans le cas ou je relance ma requete toutes les 2 secondes, la table reste toujours vide.
    Je ne comprends pas trop pourquoi il n'y a rien car à chaque tour de boucle, il faut bien vider la table puis ensuite relancer la requete...

    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
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
     
    import sun.jdbc.odbc.JdbcOdbcDriver;
     
    import java.sql.Connection;
    import java.sql.Driver;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.Statement;
    import java.util.List;
    import java.util.ArrayList;
     
    public class MyTableModel5 extends AbstractTableModel{
    	private static final long serialVersionUID = 1L;
     
    	String[] colonnes = {"PERSONNE","OUVERT","FERME"};
    	//la liste du contenu de ton tableau 
    	private List<Object[]> allLignes = new ArrayList<Object[]>();
     
    	//constructeur vide 
    	public MyTableModel5(){}
     
    	//constructeur avec la liste
    	public MyTableModel5(List<Object[]> allLignes){
    		//test si la liste est vide rajouter une ligne vide
    		if (allLignes == null || allLignes.size()<1){
    			allLignes.add(new Object[colonnes.length]);
    		}
    		this.allLignes = allLignes;
    	}
     
    	/* retourne le nombre d'element de la colonne */
    	public int getColumnCount() {
    		return colonnes.length;
    	}
     
    	/* retourne le nombre de lignes */
    	public int getRowCount() {
    		return allLignes.size();
    	}
     
    	/* retourne le nom de la colonne */
    	public String getColumnName(int col) {
    		return colonnes[col];	
    	}
     
    	/* retourne la valeur à la ligne row et colonne col */
    	public Object getValueAt(int row, int col) {
    		return allLignes.get(row)[col];
    	}
     
    	public Class getColumnClass(int c) {
    		return getValueAt(0, c).getClass();
    	}
     
    	/* definie les cellules éditables ou non */
    	public boolean isCellEditable(int row, int col) {
    			return false;
    	}
     
    	/* permet de modifier l'element en placant value a la ligne row 
    	colonne col */
    	public void setValueAt(Object value, int row, int col) {
    		allLignes.get(row)[col] = value;
    		fireTableCellUpdated(row, col); // on signal un changement
    	}
     
    	//Pour remplir ton tableau t'as juste besoin de 
    	public void remplie(List<Object[]> lignes){
    		allLignes = lignes;
    	}
     
    	//et tu peux meme vider ta table
    	public void vide(){
    		allLignes.removeAll(allLignes);
    		fireTableRowsDeleted(0,getRowCount());
    	}	
     
    	public static void main(String [] args){
    		MyTableModel5 maTable = new MyTableModel5();
    		JTable jTable = new JTable(maTable);
    		List<Object[]> donnees = new ArrayList<Object[]>();
     
    		//Parametre de connexion a la base de données
    		String url="jdbc:odbc:MATABLE";
        String login = "root";
        String password = "root";
        Connection connection = null;
     
        try{
    			Driver monDriver = new JdbcOdbcDriver();
    			DriverManager.registerDriver(monDriver);	
    			connection=DriverManager.getConnection(url,login,password);
     
    			Statement stmt = 
    connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
     
    			String sql = "SELECT * FROM MATABLE.Test"
     
    			ResultSet rs = stmt.executeQuery(sql);
     
    			ResultSetMetaData rsmd = rs.getMetaData();
    			int ncols = rsmd.getColumnCount();
     
    			rs.last();
    			int nlignes=rs.getRow();
    			//Remise du curseur à sa position initiale
    			rs.beforeFirst();
     
    			boolean suivant = rs.next();
    			while(suivant){
    				Object datas[] = new Object[nlignes];
    				for(int j=1; j<=ncols; j++){
    					datas[j-1] = rs.getString(j);
    				}
    				suivant = rs.next();
    				donnees.add(datas);
    			}
    			((MyTableModel5)jTable.getModel()).remplie(donnees);
    			JFrame frame = new JFrame("MyTableModel");
    			JScrollPane scroll = new JScrollPane(jTable);
    			frame.setSize(300,200);
    			frame.add(scroll);
    			frame.setVisible(true);
    			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    			//System.out.println(maTable.getColumnCount() + " " + 
    maTable.getRowCount());
     
    			while(true){		
    				maTable.vide();		
    				rsmd = rs.getMetaData();
    				ncols = rsmd.getColumnCount();
     
    				rs.last();
    				nlignes=rs.getRow();
    				//Remise du curseur à sa position initiale
    				rs.beforeFirst();
     
    				suivant = rs.next();
    				while(suivant){
    					Object datas[] = new Object[nlignes];
    					for(int j=1; j<=ncols; j++){
    						datas[j-1] = rs.getString(j);
    					}
    					suivant = rs.next();
    					donnees.add(datas);
    				}
    				((MyTableModel5)jTable.getModel()).remplie(donnees);
    				try {
    					Thread.sleep(2000);
    				}catch(InterruptedException ie){}
    			}
        }catch(Exception e){
        	e.printStackTrace();
        }			
    	}
    }

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par maxlegrand
    Je ne comprends pas trop pourquoi il n'y a rien car à chaque tour de boucle, il faut bien vider la table puis ensuite relancer la requete...
    A chaque fois que tu modifies ton modèle de données, tu dois envoyer un évènement pour le signaler à la JTable (et éventuellement à d'autres listeners) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	//Pour remplir ton tableau t'as juste besoin de 
    	public void remplie(List<Object[]> lignes){
    		allLignes = lignes;
    		// On signale le changement des données aux listeners :
    		fireTableDataChanged();
    	}
    a++

Discussions similaires

  1. Ajout d'une nouvelle ligne
    Par Redg9 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 23/01/2009, 14h51
  2. Ajouter case à cocher pour une nouvelle ligne
    Par skunkies dans le forum Excel
    Réponses: 3
    Dernier message: 30/05/2008, 01h13
  3. Réponses: 3
    Dernier message: 23/05/2008, 14h52
  4. Ajouter une nouvelle ligne sous la cellule actuellement sélectionnée
    Par agronomia dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/02/2008, 09h50
  5. message "Vous allez ajouter une nouvelle ligne"
    Par Rizel dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/09/2007, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo