[serialisation] JTABLE pb [Résolu]

Signaler
Messages postés
78
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
10 août 2005
-
Messages postés
78
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
10 août 2005
-
salut,
j'arrive a serialiser une jtable mais le petit probleme suibvant apparait :

(la serialisation marche si je rajoute ou supprime des lignes sans les editer)
ça plante quand j'edite une ligne et sauvegarder juste aprés
mais quand j'edite une ligne et avant de sauvegarder j'en supprime une autre ça fonctionne
etant debutant en java et 1ere utilisation de JTABLE je ne sais pas que ce qu'il, faut faire pour prendre en compte l'edition des champs

si vous voyez ce qu'il faut faire faites moi en part
MERCI...

import javax.swing.*;
import java.awt.event.*;
import java.util.Vector;

import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.TitledBorder;
import java.text.*;
import javax.swing.table.*;

public class Test extends JFrame implements Serializable
{

public JTable table;
JPanel pann = new JPanel(new GridLayout(0,1));
JPanel gestion = new JPanel(new GridLayout(1,3));
public DefaultTableModel model;

public Test()
{

JButton Ajouter = new JButton("Ajouter");
JButton Supprimer = new JButton("Supprimer");
JButton Valider = new JButton("Valider");
pann.setPreferredSize(new Dimension(500, 500));

try {
File file = new File("sauve.tmp");
//deserialisation
if(file.exists() ) {
FileInputStream fis = new FileInputStream("sauve.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
table = new JTable();
model = (DefaultTableModel) ois.readObject();
table.setModel(model);

ois.close();
} else {

model = new DefaultTableModel(0,1);
table = new JTable();
table.setModel(model);

}

}catch(Exception e)
{
e.printStackTrace();
}

pann.add(table);
getContentPane().add("Center",pann);
gestion.add(Ajouter);
gestion.add(Supprimer);
gestion.add(Valider);
setSize(600,400);
getContentPane().add("South",gestion);
table.setPreferredScrollableViewportSize(new Dimension(500, 400));

addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{
//System.exit(0);
setVisible(false);
}
});

Ajouter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
ajouter_actionPerformed(e);

}
});

Supprimer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
supprimer_actionPerformed(e);
}

});

Valider.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
sauve_actionPerformed(e);
// System.exit(0);
setVisible(false);

}
});
}

public void supprimer_actionPerformed(ActionEvent e){

int [] selected = table.getSelectedRows();
for (int i = selected.length - 1; i >= 0; i--)
model.removeRow(selected[i]);
}

public void ajouter_actionPerformed(ActionEvent e){

/* Integer[] newCells = new Integer[model.getColumnCount()];
for (int i = 0; i < newCells.length; i++)
newCells[i] = new Integer((i + 1)
* (model.getRowCount() + 1));
model.addRow(newCells);*/
String [] data = new String [model.getColumnCount()];
data[0] = "http://";
model.addRow(data);
}

public void sauve_actionPerformed(ActionEvent e) {

try {
//Serialisation
FileOutputStream fos = new FileOutputStream("sauve.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(model);
oos.close();
System.exit(0);
} catch (IOException e1) {
e1.printStackTrace();
}
}

public static void main(String[] args)
{
Test test = new Test();
test.pack();
test.setVisible(true);

}

}

8 réponses

Messages postés
78
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
10 août 2005

salut pour ce qui on le meme problme que moi voila la solution*

avant de serialiser il faut faire

if(table.isEditing()){
if (table.getCellEditor() != null) {
table.getCellEditor().stopCellEditing();
}
}

voila
Messages postés
649
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
9 septembre 2004
7
c quoi le message quand il plante?
Messages postés
78
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
10 août 2005

c'est :

noserializable Exception...reflect constructor et apparement il n'aime pas l'initialisation de mon model

File file = new File("sauve.tmp");
//deserialisation
if(file.exists() ) {
FileInputStream fis = new FileInputStream("sauve.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
table = new JTable();
model = (DefaultTableModel) ois.readObject();//ICI!!!!!!!!!!!
table.setModel(model);
Messages postés
649
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
9 septembre 2004
7
Met un TableModel ca devrait le calmer
Messages postés
78
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
10 août 2005

il dit que c abstract et que je ne peux pas l'instancier !!!!!!!
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
10
En fait il n est pas tres judicieu de serializer un model ... ;o)
Utilise plutot la methode getData() pour en obtenir les données et ce sont les données que tu doit sérializer (enfin sauvegarder à l aide de la serialization ;o) héhé)
ensuite il ne te restera plus qu a rempliur ta table avec les donnee obtenu ...

Le gro prob qd tu write une class que tu ne conne pas bien ... c que tu ne peu pas tro predir le comportement de chacun de ses attribut ... certain peuvent etre "Transient " et ds ce cqs tu ne pourra en restituer la valeur par la serialization .... dc evite la serialization sur des class tro complex.... ;o) ...

++

GodConan :clown)
Messages postés
78
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
10 août 2005

en fait j'ai compris maintenant qu'il faut juste appuyer sur le ENTREE avant de Validez(il suffit d'enlever le curseur de la jtable avant de valider) pour que ça marche maintenant ce que je veux c un moyen d'empecher les utilisateur d'appuyez sur le bouton Validez tant que le curseur est dans une cellule de la Jtable?????????

quelqu'un sait comment on fait???

MERCI...........
Messages postés
649
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
9 septembre 2004
7
tu fait l'inverse: quand quelqu'un appuis sur valider, tu degages le curseur de la cellule (si il y en a un)