Parcourir un Hashtable

Résolu
envisat Messages postés 3 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 16 juillet 2004 - 15 juil. 2004 à 19:46
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 - 16 juil. 2004 à 13:42
Bonjour à tous.... J'ai besoin d'un coup de pouce SVP

je suis entrain de faire un projet scolaire et je dois utiliser un hastable pour mette des données. Je dois la parcourir et faire afficher les informations dans des JTextField. Je ne sais pas comment y parvenir. Cette partie du programme doit être fait avec des bouttons suivant et précedent....je mets mon code pour voir si qqun peut m'aider.......................Merci à l'avance

public class PanneauMiseaJourClient extends JFrame
{

private JLabel LabelCompte = new JLabel("COMPTE",JLabel.CENTER);
private JLabel LabelNom = new JLabel (" NOM ", JLabel.CENTER);
private JLabel LabelPrenom = new JLabel ("PRÉNOM", JLabel.CENTER);
private JLabel LabelSexe = new JLabel (" SEXE ", JLabel.CENTER);
private JLabel LabelSolde = new JLabel ("SOLDE ", JLabel.CENTER);

private JTextField TFCompte = new JTextField (20);
private JTextField TFNom = new JTextField (20);
private JTextField TFPrenom = new JTextField (20);
private JTextField TFSexe = new JTextField (20);
private JTextField TFSolde = new JTextField (20);

private JButton BtOuvrir = new JButton("Ouvrir Fichier");
private JButton BtSuivant = new JButton("Client Suivant");
private JButton BtFermer = new JButton("Fermer Fichier");
private JButton BtPrecedent = new JButton("Client Précédent");
private JButton BtModifier = new JButton("Modifier Client");
private JButton BtSupprimer = new JButton("Supprimer Client");

private JPanel pane1 = new JPanel();
private JPanel pane2 = new JPanel();
private JPanel panneauMiseaJourClient = new JPanel();

private Client temp;
private int courant;

private Hashtable htable = new Hashtable();

public PanneauMiseaJourClient(String titre)
{


super(titre);
panneauMiseaJourClient.setSize(400,300);
panneauMiseaJourClient.setBackground(Color.blue);


// ajout des éléments au pane1
pane1.setLayout(new GridLayout(5,2));
pane1.setBackground(Color.blue);
pane1.add(LabelCompte);
pane1.add(TFCompte);
pane1.add(LabelNom);
pane1.add(TFNom);
pane1.add(LabelPrenom);
pane1.add(TFPrenom);
pane1.add(LabelSexe);
pane1.add(TFSexe);
pane1.add(LabelSolde);
pane1.add(TFSolde);

// ajout des éléments au pane2
pane2.setLayout(new GridLayout(2,3));
pane2.setBackground(Color.blue);
pane2.setForeground(Color.white);
pane2.add(BtOuvrir);
pane2.add(BtSuivant);
pane2.add(BtPrecedent);
pane2.add(BtModifier);
pane2.add(BtSupprimer);
pane2.add(BtFermer);

//ajout des pane 1 et 2 au panneauAjoutClient
panneauMiseaJourClient.add (pane1, BorderLayout.CENTER);
panneauMiseaJourClient.add (pane2, BorderLayout.SOUTH);

//ajout des gestion d'événements
BtOuvrir.addActionListener(new GestEvent());
BtSuivant.addActionListener(new GestEvent());
BtPrecedent.addActionListener(new GestEvent());
BtModifier.addActionListener(new GestEvent());
BtSupprimer.addActionListener(new GestEvent());
BtFermer.addActionListener(new GestEvent());
}

public class GestEvent implements ActionListener
{

public void actionPerformed(ActionEvent e)
{

File buf = new File("Client.dat");

if (e.getSource() == BtOuvrir)
{

try
{

JFileChooser choix = new JFileChooser();

choix.showOpenDialog(null);

ObjectInputStream agent = new ObjectInputStream (new FileInputStream(buf));

Client temp = new Client();

temp = (Client)agent.readObject();

TFCompte.setText(String.valueOf(temp.getCompte()));
TFNom.setText(temp.getNom());
TFPrenom.setText(temp.getPrenom());
TFSexe.setText(String.valueOf(temp.getSexe()));
TFSolde.setText(String.valueOf(temp.getSolde()));

agent.close();
}

catch (Exception ex)
{

}

}

else if (e.getSource() == BtSuivant)
{

if(courant == htable.size()-1)
{
JOptionPane.showMessageDialog(null,"Vous êtes au dernier élément du tableau");
}
else
{
courant++;
temp = (Client) htable.elementAt(courant);
TFCompte.setText(String.valueOf(temp.getCompte()));
TFNom.setText(temp.getNom());
TFPrenom.setText(temp.getPrenom());
TFSexe.setText(String.valueOf(temp.getSexe()));
TFSolde.setText(String.valueOf(temp.getSolde()));
}
}

else if (e.getSource() == BtPrecedent)
{

if(courant == 0)
{
JOptionPane.showMessageDialog(null,"Vous êtes au premier élément du tableau");
}
else
{
courant--;
temp = (Client) htable.elementAt(courant);
TFCompte.setText(String.valueOf(temp.getCompte()));
TFNom.setText(temp.getNom());
TFPrenom.setText(temp.getPrenom());
TFSexe.setText(String.valueOf(temp.getSexe()));
TFSolde.setText(String.valueOf(temp.getSolde()));
}
}

else if (e.getSource() == BtModifier)
{

htable.put(TFCompte.getText(),TFNom.getText(),TFPrenom.getText(),TFSexe.getText(),TFSolde.getText());
vider();
}

else if (e.getSource() == BtSupprimer)
{

TFCompte.setText(JOptionPane.showInputDialog(null,"Entrer le compte à supprimer"));
htable.remove(TFCompte.getText());
vider();
}

else if (e.getSource() == BtFermer)
{

try
{

JFileChooser choix = new JFileChooser();

choix.showSaveDialog(null);

ObjectOutputStream agent = new ObjectOutputStream(new FileOutputStream(buf));

Client temp = new Client();

temp.setCompte (Integer.parseInt(TFCompte.getText()));
temp.setNom (TFNom.getText());
temp.setPrenom(TFPrenom.getText());
temp.setSexe(Character.parseChar(TFSexe.getText()));
temp.setSolde(Integer.parseInt(TFSolde.getText()));

agent.writeObject(temp);
}

catch (Exception ex)
{

}
}
}

public void vider()
{

TFCompte.setText(String.valueOf(0));
TFNom.setText("");
TFPrenom.setText("");
TFSexe.setText(String.valueOf(' '));
TFSolde.setText(String.valueOf(0));
}
}

10 réponses

cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
15 juil. 2004 à 20:15
:big) Neodante :big)

Pour parcourir une hashtable comme pour parcourir n'importe quelle collection de JFC (Java Framework Collection ... un truc comme ça !) tu utilises les Iterator ... ce qui as un avantage considérable ... mais tu découvriras ça plus tard !

Iterator it = hashtable.iterator();
while (it.hasNext()){
TotoClasse titi = (TotoClasse)it.next();
// Utilisation de l'objet ...
}

Voilà tu vas pouvoir parcourir ta hashtable ...
@+

[Responsable www.neogamedev.com]
3
gmi19oj19 Messages postés 545 Date d'inscription lundi 10 mai 2004 Statut Membre Dernière intervention 28 septembre 2011 2
15 juil. 2004 à 20:41
Neodante, je ne critiquerai pas le point de vue sur les iterator car je le partage (meme si j'utilise plus des Enumeration, tout aussi utile, pour des Vector)

Mais, pour le principe, au vu de son problème, je dirai qu'il doit gérer un compteur pour le rang, du fait qu'il cherche à pouvoir reculer, et non qu'avancer dans la HashTable.

Car je ne crois pas qu'il y est de méthode pour récuperer l'élément précédent (à vérifier).
3
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
15 juil. 2004 à 21:33
:big) Neodante :big)

Y a pas de mal ... en plus tu ne critiques (à moins que ce soit vraiment dans ton idée ... je sais je joue les psycho à 2 balles de temps en temps !! lol) .... tu complètes sur ce que j'ai dit et c'est vrai que j'étais un peu à côté de la plaque !!!! lol

M'enfin je vais me rattrapper (j'espère !). C'est vrai les iterator() ne permettent pas de revenir en arrière et là n'est pas leur but ....
En revanche pourquoi utilises-tu une hashtable ??? Ne pourrais tu pas utilisé une LinkedList ... que tu dériverais en y ajoutant des méthodes pour parcourir ta chaine ... bon d'accord ca demande de regarder un peu les sources de Java (y a juste à décompresser le sources.zip du JDK) et de faire un héritage ... mais cela reste simple ...

Car pour ton problème la structure de données la plus adpatée est sans aucun doute la liste chainée ... ici double puisque tu as besoin de parcourir dans n'importe quel sens celle-ci !

Voilà ! J'espère mettre un peu rattrappé même si cela peut te paraitre obscur ... j'espère que non !
@+

[Responsable www.neogamedev.com]
3
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
16 juil. 2004 à 09:37
:big) Neodante :big)

Bon alors ... réfléchissons ... il existe une méthode get() qui te renvoie l'objet en fonction de sa clé ... il suffirait en fait que lorsque tu ajoutes des objets tu mettes une clé de type Integer (par int mais Integer i = new Integer(1) par ex !) et que ensuite tu demandes maHashTable.get(new Integer(maSelection)) ... tout simplement ...

Sinon pour ton prob d'ajout de personne ... tu ajoutes l'objet client directement dans ta hashtable ... la hashtable ne prend pas que des String comme objet mais n'importe quel objet.

Je crois que tu n'as pas bien compris le fonctionnement de la hashtable ... la méthode put() ne prend que 2 arguments, la clé et l'objet que tu veux stocker ... regarde la JavaDoc si tu veux tout de suite démistifier cette classe : http://java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html ou dans la javadoc à télécharger à part du JDK.

De toute manière pour programmer en Java, la javadoc est indispensable ... sinon on rame et on arrive à rien ! En plus on ne progresse !

@+

[Responsable www.neogamedev.com]
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
16 juil. 2004 à 10:14
Salut,

pour parcourir ta hashtable tu peux utiliser la méthodes values() qui te renvoie une collection des valeurs. Seul problème c'est qu'elle n'est pas ordonnée (tu ne retrouveras pas les éléments dans l'ordre dans lequel tu les as rentré). Ensuite pour parcourir dans les 2 sens tu peux utiliser ListIterator mais qui est définit sur List et non sur Collection.
donc il faut faire un truc du genre

ListIterator listIterator=new ArrayList(hash.values()).listIterator();


Regarde la javadoc pour les méthodes disponibles
3
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
16 juil. 2004 à 11:23
:big) Neodante :big)

J'y avais pensé (lol) mais puisqu'il doit se servir de la hashtable uniquement et pas d'autres choses ... sinon il aurait surement utilisé autre chose ... un HashMap ou une LinkedList custom ou effectivement un ArrayList ... mais bon l'école reste l'école ... lol ... je sais j'y suis encore à moitié ! C'est triste quand même que lorsque tu veuilles faire différemment (et souvent mieux !) tu ne puisses pas ...
@+ everybody

[Responsable www.neogamedev.com]
3
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
16 juil. 2004 à 13:42
:big) Neodante :big)

lol ... un jour moi aussi j'espère que j'aurais fini !!!
@+

[Responsable www.neogamedev.com]
3
envisat Messages postés 3 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 16 juillet 2004
16 juil. 2004 à 00:15
malheureusement je dois absolument utiliser una hashtable dûes aux contraintes imposées par le professeur...je rappelle que c'est un projet scolaire...Est-ce possible de ramener la hashtable dans une autre forme et ensuite ramener les données voulues

mon problème de code se situe au niveau du
else if (e.getSource() == BtSuivant)
{

if(courant == htable.size()-1)
{
JOptionPane.showMessageDialog(null,"Vous êtes au dernier élément du tableau");
}
else
{
courant++;
temp = (Client) htable.elementAt(courant);
TFCompte.setText(String.valueOf(temp.getCompte()));
TFNom.setText(temp.getNom());
TFPrenom.setText(temp.getPrenom());
TFSexe.setText(String.valueOf(temp.getSexe()));
TFSolde.setText(String.valueOf(temp.getSolde()));
}
}

else if (e.getSource() == BtPrecedent)
{

if(courant == 0)
{
JOptionPane.showMessageDialog(null,"Vous êtes au premier élément du tableau");
}
else
{
courant--;
temp = (Client) htable.elementAt(courant);
TFCompte.setText(String.valueOf(temp.getCompte()));
TFNom.setText(temp.getNom());
TFPrenom.setText(temp.getPrenom());
TFSexe.setText(String.valueOf(temp.getSexe()));
TFSolde.setText(String.valueOf(temp.getSolde()));
}
}
0
envisat Messages postés 3 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 16 juillet 2004
16 juil. 2004 à 00:19
dans un autre ordre d'idée... j'ai 5 JTextField à mettre dans la hashtable comment faire sans perdre de données...
le code suivant n'est pas valide, je ne sais que faire...

htable.put(TFCompte.getText(),TFNom.getText(),TFPrenom.getText(),TFSexe.getText(),TFSolde.getText());

si je fait plusieurs htable.put mes données seront perdues car chaque put qui est fait ré-écris par dessus les données entrées précédemment...
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
16 juil. 2004 à 11:31
c'est clair que pour stocker une liste d'objet la hashtable n'est pas le meilleur choix mais ne pas avoir la possibilité d'utiliser quelquechose pour améliorer ça c'est vraiment pénible. Comme tu dis "l'école c'est l'école" et je suis bien content d'en être sorti et de pouvoir faire ce que je veux :)
0
Rejoignez-nous