Parcourir un Hashtable [Résolu]

envisat 3 Messages postés vendredi 2 juillet 2004Date d'inscription 16 juillet 2004 Dernière intervention - 15 juil. 2004 à 19:46 - Dernière réponse : cs_neodante 2837 Messages postés lundi 11 août 2003Date d'inscription 16 décembre 2006 Dernière intervention
- 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));
}
}
Afficher la suite 

10 réponses

Répondre au sujet
cs_neodante 2837 Messages postés lundi 11 août 2003Date d'inscription 16 décembre 2006 Dernière intervention - 15 juil. 2004 à 20:15
+3
Utile
: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]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_neodante
gmi19oj19 546 Messages postés lundi 10 mai 2004Date d'inscription 28 septembre 2011 Dernière intervention - 15 juil. 2004 à 20:41
+3
Utile
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).
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de gmi19oj19
cs_neodante 2837 Messages postés lundi 11 août 2003Date d'inscription 16 décembre 2006 Dernière intervention - 15 juil. 2004 à 21:33
+3
Utile
: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]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_neodante
cs_neodante 2837 Messages postés lundi 11 août 2003Date d'inscription 16 décembre 2006 Dernière intervention - 16 juil. 2004 à 09:37
+3
Utile
: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]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_neodante
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 16 juil. 2004 à 10:14
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de kirua12
cs_neodante 2837 Messages postés lundi 11 août 2003Date d'inscription 16 décembre 2006 Dernière intervention - 16 juil. 2004 à 11:23
+3
Utile
: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]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_neodante
cs_neodante 2837 Messages postés lundi 11 août 2003Date d'inscription 16 décembre 2006 Dernière intervention - 16 juil. 2004 à 13:42
+3
Utile
:big) Neodante :big)

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

[Responsable www.neogamedev.com]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_neodante
envisat 3 Messages postés vendredi 2 juillet 2004Date d'inscription 16 juillet 2004 Dernière intervention - 16 juil. 2004 à 00:15
0
Utile
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()));
}
}
Commenter la réponse de envisat
envisat 3 Messages postés vendredi 2 juillet 2004Date d'inscription 16 juillet 2004 Dernière intervention - 16 juil. 2004 à 00:19
0
Utile
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...
Commenter la réponse de envisat
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 16 juil. 2004 à 11:31
0
Utile
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 :)
Commenter la réponse de kirua12

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.