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 :

Modifier et rafraichir cellule JTable


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Par défaut Modifier et rafraichir cellule JTable
    Bonjour,

    J'essaye tant bien que mal à apprendre à manier une bdd via java.
    En cherchant sur le net et dans les bouquins, j'ai pu arrivé à ce résultat.
    Je cherche à modifier une cellule et qu'elle soit enregistré dans la bdd avec un rafraichissement des cellules.
    Mais voila, j'ai un problème dans ma methode setValueAt, j'ai essayé plusieurs combinaison en vain.

    Merci

    J'ai ce message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at bd.ResultSetTableModel.setValueAt(ResultSetTableModel.java:96)
    plus plusieurs lignes
    Le model:

    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 bd;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
     
    import javax.naming.spi.DirStateFactory.Result;
    import javax.swing.table.AbstractTableModel;
     
     
    public class ResultSetTableModel extends AbstractTableModel
    {
      public ResultSetTableModel( ResultSet resultSet )
      {
        this.resultSet = resultSet;
     
        try 
        {
          this.resultSetMetaData = resultSet.getMetaData();
        } 
        catch (SQLException e) 
        {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
      @Override
      public int getColumnCount()
      {
    	try 
        {
          return resultSetMetaData.getColumnCount();
        } 
        catch (SQLException e) 
        {
          // TODO Auto-generated catch block
          e.printStackTrace();
          return 0;
        }
      }
     
      @Override
      public int getRowCount()
      {
    	try
        {
          resultSet.last();
          return resultSet.getRow();
        } 
    	catch (SQLException e)
        {
          // TODO Auto-generated catch block
          e.printStackTrace();
          return 0;
        }
      }
     
      @Override
      public Object getValueAt(int rowIndex, int columnIndex) 
      {
        try
        {
          resultSet.absolute( rowIndex + 1 );
          return resultSet.getObject(columnIndex + 1 );
        } 
        catch (SQLException e)
        {
          // TODO Auto-generated catch block
          e.printStackTrace();
          return null;
        }
      }
     
      @Override
      public String getColumnName( int column )
      {
        try 
        {
          return resultSetMetaData.getColumnName( column + 1 );
        } 
        catch (SQLException e) 
        {
          // TODO Auto-generated catch block
          e.printStackTrace();
          return "";
        }
      }
     
     
      @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    	// TODO Auto-generated method stub
     
    		try {
    			rowIndex = resultSet.getRow();
    			columnIndex = resultSetMetaData.getColumnCount();
    			data[rowIndex][columnIndex] = aValue;
    			fireTableCellUpdated(rowIndex, columnIndex);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
     
    }
     
      @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    	// TODO Auto-generated method stub
    	return true;
    }
      private Object data[][];
      private ResultSet resultSet;
      private ResultSetMetaData resultSetMetaData;
    Le panel

    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
    package bd;
    import java.awt.BorderLayout;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.TableModel;
     
     
    public class TablePanel extends JPanel implements ActionListener
    {
      public TablePanel( TableModel model )
      {
        table = new JTable( model );
        btn = new JButton("Sauver");
        setLayout( new BorderLayout() );
        add( new JScrollPane( table ), BorderLayout.CENTER );
        add (btn, BorderLayout.SOUTH);
        btn.addActionListener(this);
        //table.addMouseListener(this);
     
        table.addMouseListener(new MouseAdapter() {
        	  public void mouseClicked(MouseEvent e) {
        		    Point p = e.getPoint();
        		    int col = table.columnAtPoint(p);
        		    int row = table.rowAtPoint(p);
        		    if (table.isCellEditable(row, col)) {
        		    	table.editCellAt(row, col);
        		    	table.getEditorComponent().requestFocus();
        		    }
        	}
    	});
     
      }
     
      private JTable table;
      private JButton btn;
      private Connection conn;
      @Override
      public void actionPerformed(ActionEvent e) {
      	Main.sauver();
     
      } 
     
    }
    le Main

    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
     
    package bd;
    import java.awt.BorderLayout;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    import javax.swing.JFrame;
     
     
    public class Main
    {
      public static void main(String[] args)
      {
        Connection connection = getConnection();
        try
        {
            Statement st = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,
                    								   ResultSet.CONCUR_UPDATABLE );
            //st.executeUpdate("DELETE FROM Personne WHERE nom='kalal'");
            rs = st.executeQuery( "SELECT * FROM Personne" );
            ResultSetTableModel rtm = new ResultSetTableModel( rs );
     
            TablePanel tablePanel = new TablePanel( rtm );
     
            JFrame mainFrame = new JFrame( "Affiche table " );
            mainFrame.add( tablePanel, BorderLayout.CENTER );
            mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
            mainFrame.setSize( 640, 480 );
            mainFrame.setVisible( true );
        } 
        catch ( SQLException e )
        {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
     
      public static Connection getConnection()
        {
          Connection connection = null;
          boolean ok = false;
     
          //--- chargement en mémoire du pilote
          try
         {
           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           ok = true;
         } 
         catch ( ClassNotFoundException e )
         {
           System.out.println( "ERREUR chargement du pilote: pilote non trouvé" );
           e.printStackTrace();
         }
     
         //--- connexion à la base de données
         if ( ok )
         {
           try
           {
             connection = DriverManager.getConnection("jdbc:odbc:bdformation","","");
             //connection.setAutoCommit(false);
           } 
           catch ( SQLException e )
           {
             System.out.println( "ERREUR de connexion à la base de données: " );
             e.printStackTrace();
           }
         }
     
          return connection;
        }
      public static void sauver(){
    	  try {
    		rs.updateRow();
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
      }
     
        //--- attributs
     
        private static ResultSet rs = null;
    }

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data[rowIndex][columnIndex]
    Le tableau data n'est instancié nulle part dans ton code. si tu veux stocker des données dans un tableau, il faut l'instancier.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data[rowIndex][columnIndex]
    Le tableau data n'est instancié nulle part dans ton code. si tu veux stocker des données dans un tableau, il faut l'instancier.
    Merci,

    Je me suis cassé la tête jusqu’à 4 heure du mat

    J'ai remplacé la ligne
    data[rowIndex][columnIndex] = aValue;
    par
    data = new Object[][]{{rowIndex,columnIndex}};

    J'ai pas d'erreurs mais la saisie n'est pas enregistré, elle revient à la valeur par défaut.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Mercenaire Voir le message
    data = new Object[][]{{rowIndex,columnIndex}};
    Ca, ça crée un tableau de dimensions [1,2] contenant les deux éléments "rowIndex" et "columnIndex", je pense que ce n'est pas ça que tu cherche à faire



    Ensuite, je ne vois dans ton code rien qui tente, de près ou de loin, de faire un update sur la base de données.

    Enfin, quel est l'usage de ce tableau? Puisque toutes tes méthode récupèrent directement les données depuis le resultset?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ca, ça crée un tableau de dimensions [1,2] contenant les deux éléments "rowIndex" et "columnIndex", je pense que ce n'est pas ça que tu cherche à faire



    Ensuite, je ne vois dans ton code rien qui tente, de près ou de loin, de faire un update sur la base de données.

    Enfin, quel est l'usage de ce tableau? Puisque toutes tes méthode récupèrent directement les données depuis le resultset?
    Sur le net j'ai vu que pour faire un update il fallait utilisé fireTableCellUpdated().

    Je cherche à modifié les données directement dans les cellules du tableau et que celle ci soit prise en compte automatiquement dans la bd avec rafraichissement des cellules.

    Lorsque je modifie ma cellule et que je quitte la cellule l'ancienne valeur est remise.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    le fire ne sert qu'à notifier tous les listener que tu as fait un changement. Sauf que ton code ne fait aucun changement. Donc forcément, c'est toujours l'ancienne valeur qui reste. tu dois revoir tout ton code.

    D'abord, le resultset, en général, c'est readonly: donc tu dois le parcourir une fois pour tout et initialiser un tableau avec les données qui y sont présentes. Ce ne sera possibleque si les données sont en quantité restreintes et donc peuvent tenir en mémoire.

    Ensuite, le valueAt devra utiliser ce tableau et pas le resultset

    enfin, quand une modification est faite, a toi de te connecter à ta base de donnée et de faire une requete SQL "update" qui correspond.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    le fire ne sert qu'à notifier tous les listener que tu as fait un changement. Sauf que ton code ne fait aucun changement. Donc forcément, c'est toujours l'ancienne valeur qui reste. tu dois revoir tout ton code.

    D'abord, le resultset, en général, c'est readonly: donc tu dois le parcourir une fois pour tout et initialiser un tableau avec les données qui y sont présentes. Ce ne sera possibleque si les données sont en quantité restreintes et donc peuvent tenir en mémoire.

    Ensuite, le valueAt devra utiliser ce tableau et pas le resultset

    enfin, quand une modification est faite, a toi de te connecter à ta base de donnée et de faire une requete SQL "update" qui correspond.
    Mon resultset est CONCUR_UPDATABLE.

    Ensuite, le valueAt devra utiliser ce tableau et pas le resultset
    là j'ai pas compris

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    si ton resultSet est updatable, tu peux l'utiliser, mais alors ton tableau ne sert à rien (jette le) et fait l'update dans le result set (là dans ton setValue tu ne fais strictement rien avec le resultSet)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    si ton resultSet est updatable, tu peux l'utiliser, mais alors ton tableau ne sert à rien (jette le) et fait l'update dans le result set (là dans ton setValue tu ne fais strictement rien avec le resultSet)
    Donc si j'ai bien compris ces 2 lignes ne servent à rien ??
    rowIndex = resultSet.getRow();
    columnIndex = resultSetMetaData.getColumnCount();


    data = new Object[][]{{rowIndex,columnIndex}};
    fireTableCellUpdated(rowIndex, columnIndex);

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    a part le fire, y a rien qui sert. Vous devez positionner votre ResultSet à la bonne ligne et utilise une des nombreuses méthode updateXXX de la classe ResultSet pour mettre à jour la DB.

  11. #11
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    A noter qu'en général il est recommandé d'éviter d'utiliser directement un ResultSet dans les modèle de composants Swing.

    Il est amplement préférable de baser son modèle sur une collection d'objets de type bean.

    Puis de proposer en parallèle des objets et méthodes pour récupérer/sauvegarder ces objets en base de donnée (s'inspirant du pattern DAO).

    Ces méthodes ne doivent pas être appelées depuis le modèle, et de plus doivent être appelées dans un thread séparé (notion de gestion de l'EDT).
    De fait on a plus tendance pour gérer les updates de la base à utiliser un TableModelListener qui réagit aux divers appels des méthode fireXXX du modèle. Ce listener va déclencher l'appels des méthode s de communication avec le SGBD dans un Thread séparé. Et voilà.

    Je te recommande fortement de lire les tutos sur la JTable et sur l'EDT:
    http://baptiste-wicht.developpez.com.../swing/jtable/
    http://gfx.developpez.com/tutoriel/j...ing-threading/

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    a part le fire, y a rien qui sert. Vous devez positionner votre ResultSet à la bonne ligne et utilise une des nombreuses méthode updateXXX de la classe ResultSet pour mettre à jour la DB.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void sauver() throws SQLException{
     
    		  res.absolute(rowIndex);
    		  System.out.println(rowIndex);
    		  try {
    				res.updateRow();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	  }
    J'ai changé le code mais j'arrive pas à avoir la position courante du curseur quand je sélectionne une cellule.

    J'ai un java.sql.SQLException: Cursor position (0) is invalid

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Ce code ne met toujours rien à jour (vous n'utilisez nulle part la nouvelle valeur, donc en tout logique vous ne l'envoyez pas à la base de donnée).

    La ligne, la colonne et la nouvelle valeur vous sont fournies en paramètres de setValueAt, utilisez les.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ce code ne met toujours rien à jour (vous n'utilisez nulle part la nouvelle valeur, donc en tout logique vous ne l'envoyez pas à la base de donnée).

    La ligne, la colonne et la nouvelle valeur vous sont fournies en paramètres de setValueAt, utilisez les.
    Je récupère la nouvelle valeur dans data de type d'objet et je la remplace par l’ancienne valeur listde de type objet aussi.

    Le remplacement fonctionne est la nouvelle est bien prise en compte dans la bd quand il s'agit du même type mais j'ai un problème quand j'ai une cellule dans access de type texte avec une valeur numérique et que j'essaye d'introduire une valeur alphanumérique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Statement state = connectionDb.getInstance().createStatement();
    				state.executeUpdate("UPDATE plat SET "+columnName+" = "+data+" WHERE "+columnName+" = "+listde+"");

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2003
    Messages : 59
    Par défaut
    Citation Envoyé par Mercenaire Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Statement state = connectionDb.getInstance().createStatement();
    				state.executeUpdate("UPDATE plat SET "+columnName+" = "+data+" WHERE "+columnName+" = "+listde+"");
    J'ai trouvé l'erreur, enfait il fallait mettre ' ' pour du texte.

    J'introduit dans un JtextField une donnée, celle ci est prise dans une requête insert.

    Mon tableau se rafraichi avec la méthode fireTableDataChanged(), ça fonctionne quand j’enlève ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tableau.getModel().addTableModelListener(new TableModelListener(){
    		public void tableChanged(TableModelEvent e) {  
    	        e.getSource();
    		int row = e.getFirstRow();
    	        int column = e.getColumn();
    	        TableModel model = (TableModel)e.getSource();
    	        columnName = model.getColumnName(column);
    	        data = model.getValueAt(row, column);
    Le problème c'est qu'il prend en compte la position du JTextField au lieu de la nouvelle cellule. j'ai un java.lang.ArrayIndexOutOfBoundsException.

    Comment peut on faire en sorte qu'il prenne la position de la nouvelle cellule.

    Merci

Discussions similaires

  1. Modifier une cellule JTable
    Par totot dans le forum Composants
    Réponses: 0
    Dernier message: 15/05/2015, 17h11
  2. Modifier plusieurs Cellules JTable et données d'une Table
    Par lecaire dans le forum Composants
    Réponses: 0
    Dernier message: 08/09/2013, 22h41
  3. Rafraichir une jtable
    Par tit_oune dans le forum Composants
    Réponses: 5
    Dernier message: 12/04/2006, 16h00
  4. Comment rafraichir une JTable
    Par critok dans le forum Composants
    Réponses: 3
    Dernier message: 06/12/2005, 14h48
  5. [JTable] Rafraichir une JTable
    Par Invité dans le forum Composants
    Réponses: 4
    Dernier message: 08/12/2004, 14h40

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