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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 482
    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 482
    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 482
    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 482
    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 482
    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 482
    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.

Discussions similaires

  1. Modifier une cellule JTable
    Par totot dans le forum Composants
    Réponses: 0
    Dernier message: 15/05/2015, 16h11
  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, 21h41
  3. Rafraichir une jtable
    Par tit_oune dans le forum Composants
    Réponses: 5
    Dernier message: 12/04/2006, 15h00
  4. Comment rafraichir une JTable
    Par critok dans le forum Composants
    Réponses: 3
    Dernier message: 06/12/2005, 13h48
  5. [JTable] Rafraichir une JTable
    Par Invité dans le forum Composants
    Réponses: 4
    Dernier message: 08/12/2004, 13h40

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