Ajout d'element dans une JList

Signaler
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003
-
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003
-
Bonjour,

Voici un peu de code:

String[] tableau_tampon = {"coucou"};
JList ma_liste = new JList(tableau_tampon);

Ce code va initialiser ma liste.

Or lorsque je veux rajouter des elements, ces elements ecrasent la liste precedente, alors que je veux qu'ils soient juste rajouter.
Disons que ce tableau sera construit avec des chaines construites a partir de paquets de donnes d'un reseau ethernet. La construction du tableau ne dois pas donc obligatoirement tourne en temps reel, mais va comporter plusierus lignes lors d'une seule construction.
Si quelqu'un avait un algo... merci par avance.
++

16 réponses

Messages postés
261
Date d'inscription
jeudi 5 septembre 2002
Statut
Membre
Dernière intervention
6 octobre 2005
11
Pour faire ça, il vaut mieux définir ton ListModel, avec lui tu ajoutes et retire les données, comme tu le désires. Tu associes ce modèl à ta JList. Par exemple tu peux faire le modél ainsi :
import javax.swing.ListModel;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListDataEvent;
import java.util.Vector;

/**
 * Modéle pour la liste
 */
public class Modele implements ListModel
{
  //Stocke les données
  private Vector donnees=new Vector();
  //Stocke les écouteurs de changement
  private Vector ecouteurs=new Vector();
  /**
   * Construit un modéle vide
   */
  public Modele()
  {
  }
  /**
   * Nombre de données dans le modéle
   */
  public int getSize()
  {
    return donnees.size();
  }
  /**
   * Renvoie la donnée à l'indice index
   */
  public Object getElementAt(int index)
  {
    return donnees.elementAt(index);
  }
  /**
   * Ajoute une donnée
   */
  public void addElement(Object element)
  {
    donnees.addElement(element);
    changement();
  }
  /**
   * Enlève une donnée
   */
  public void removeElement(Object element)
  {
    donnees.remove(element);
    changement();
  }
  /**
   * Ajoute un écouteur
   */
  public void addListDataListener(ListDataListener l)
  {
    ecouteurs.addElement(l);
  }
  /**
   * Retire un écouteur
   */
  public void removeListDataListener(ListDataListener l)
  {
    ecouteurs.remove(l);
  }
  //Indique à un écouteur, qu'il y a eut un changement
  private void fire(ListDataListener ldl,ListDataEvent lde)
  {
    ldl.contentsChanged(lde);
  }
  //Indique à tous les écouteurs, qu'il y a eut un changement
  private void fire(ListDataEvent lde)
  {
    int nb=ecouteurs.size();
    for(int i=0;i<nb;i++)
      fire((ListDataListener)ecouteurs,lde);
  }
  //A appelée pour signaler les changements
  private void changement()
  {
    fire(new ListDataEvent(this,ListDataEvent.CONTENTS_CHANGED,0,getSize()-1));
  }
}


Ensuite ta liste :
import javax.swing.JList;

/**
 * Jlist facilement modifiable
 */
public class Liste extends JList
{
  //Modéle de la liste
  private Modele modele=new Modele();
  /**
   * Créée une liste vide
   */
  public Liste()
  {
    setModel(modele);
  }
  /**
   * Ajoute une ligne
   */
  public void ajoute(Object donnee)
  {
    modele.addElement(donnee);
  }
  /**
   * Ajoute plusieurs lignes
   */
  public void ajoute(Object[] donnees)
  {
    for (int i = 0; i < donnees.length; i++)
      ajoute(donnees[i]);
  }
  /**
   * Renvoie le nombre de lignes
   */
  public int nombreDonnee()
  {
    return modele.getSize();
  }
  /**
   * Renvoie la donnée à l'indice indiqué
   */
  public Object getDonnee(int indice)
  {
    return modele.getElementAt(indice);
  }
  /**
   * Retire la donnée
   */
  public void retire(Object donnee)
  {
    modele.removeElement(donnee);
  }
}


Tu n'as plus qu'alors à utiliser Liste à la place de ta JList.
Si quelquechose dans mon code ne te semble pas clair n'ésites pas.

JHelp
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

Je vais regarder tout cela. Je te contacterais si j'ai un probleme (et il y a des chances...). En tout cas merci pour ton aide.
++
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

Salut,

Ton code marche, merci beaucoup!
Cependant il me reste encore un petit probleme: celui de la taille! J'ai essaye dans le constructeur setSize, SetPrefferedSize, setMaximumSize, in ne vuet rien savoir.
Lqa liste se trouve dans un conteneur Pane. Je ne peux pas plutot regler la taille du conteneur avec le Layout?
Pariel j'ai essaye mais ca ne marche pas super...
Par contre le conteneur n'a pas sa propore classe, il est cree dans le code de la fenetre, est-ce une erreur?

D'avance merci. ;)
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

Autre erreur!!

Voici mon code:

Liste ma_liste = new Liste();
String str = new String("hello!");

public class fenetre extends JFrame
{
public fenetre()
{
ma_liste.ajoute(string_to_object(str));
}
}

Et bien ca il ne prend pas! :question)

Il dit comme erreur que ma variable n'est pas declaree. Je ne comprends vraiment pas, ou c'est moi qui suis fatigue.
Merci de regarder et de m'aider, j'en ai vraiment besoin!

++
Messages postés
261
Date d'inscription
jeudi 5 septembre 2002
Statut
Membre
Dernière intervention
6 octobre 2005
11
Esaaie plutôt :
public class fenetre extends JFrame
{
Liste ma_liste = new Liste();
String str = new String("hello!");
public fenetre()
{
ma_liste.ajoute(str); 
}
}



Ca marchera mieux. Un String est un Object, comme toute les classes en Java, donc si on peut mettre un Object, on peut tout mettre.
Ensuite les varaibles et les constantes doivent ëtre connues de la classes et donc déclarées à l'intérieur de celle-ci et non à l'extérieur.
JHelp
Messages postés
261
Date d'inscription
jeudi 5 septembre 2002
Statut
Membre
Dernière intervention
6 octobre 2005
11
Une petite erreur de ma part dans le code que je t'ai fournit., voici la méthode à corrigée :
  private void fire(ListDataEvent lde)
  {
    int nb=ecouteurs.size();
    for(int i=0;i<nb;i++)
      fire((ListDataListener)ecouteurs.elementAt(i),lde);
  }

J'ai honte :blush)

A part celà, pour la taille, tu peux en effet choisir une taille préférée, mais la taille réelle, elle sera calculerau dernier moment. A moins que tu n'utilises la méthode pack(), pour donner une taille à la feêtre principale et pas un setSize, dans ce cas,il va essayer de donner leur taille préféré aux composants, en tout cas s'en approcher le plus possible, ceci dépandant bien entendu du Layout choisit et de l'emplacement des divers composants.

Pour avoir une barre de défilement à ta Liste, quand celle ci est trop grande, met ta Liste dans un JScrollPane, en lui founissant se taille préférée à ta liste, le JScroolPane va s'adapter. N'oublies pas alors que c'est la méthode pack(), qu'il faut alors utiliser sur ta fenêtre principale.

Par exemple :
liste.setPreferredSize(new Dimension(largeur,hauteur));
conteneur.add(new JScrollPane(liste),contrainte);


JHelp
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

cf autre message: non MOI j'ai honte :blush) ,
Mais c'est ce que j'avais fait.

Code:

public class fenetre extends JFrame
{
Liste ma_liste = new Liste();
String str = new String("hello!");
public fenetre()
{
ma_liste.ajoute(str); //ERREUR
}
}

L'erreur se situe a ma_liste. La fonction ajoute demande un object. Or toi tu rentres str directement, c'est pour cela que je marque string_to_object, c'est la seule fonction que j'ai trouve qui fait apparemment ca.
En mettant juste str, ca ne se compile meme pas et la fenetre n'apparait pas. En plus je travaille avec Bluej (www.bluej.org) et c'est une version beta alors...

Je continue de voir.
Merci beaucoup de ton aide :kisses)
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

cf autre message: non MOI j'ai honte :blush) ,
Mais c'est ce que j'avais fait.

Code:

public class fenetre extends JFrame
{
Liste ma_liste = new Liste();
String str = new String("hello!");
public fenetre()
{
ma_liste.ajoute(str); //ERREUR
}
}

L'erreur se situe a ma_liste. La fonction ajoute demande un object. Or toi tu rentres str directement, c'est pour cela que je marque string_to_object, c'est la seule fonction que j'ai trouve qui fait apparemment ca.
En mettant juste str, ca ne se compile meme pas et la fenetre n'apparait pas. En plus je travaille avec Bluej (www.bluej.org) et c'est une version beta alors...

Je continue de voir.
Merci beaucoup de ton aide :kisses)
Messages postés
261
Date d'inscription
jeudi 5 septembre 2002
Statut
Membre
Dernière intervention
6 octobre 2005
11
Je ne comprends pas pourquoi ça ne compile pas avec simplement avec str. Chez moi ça marche trés bien et çà devrait marché partout, c'est les fondements même de Java. Fais une chose importante, tu peux dire que c'est du chipotage, mais parfois source d'erreur, commence toujours le nom d'une classe par une majuscule. Ta classe Fenetre est bien dans un fichier nomé Fenetre.java ?
Peux-tu afficher l'erreur que te donne le compilateur ?

JHelp
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

Oui mon fichier se trouve bien dans fenetre.java. Mais ca marche en inserant l'objet directement.

paquet paquet_un = new paquet(100, 8080); //Creation d'une instance de la classe "paquet"

puis dans le constructeur:
ma_liste.ajoute(paquet_un);

donc c'est bon. Cependant cela m'ajoute dans la liste "paquet@ee9658" enfin paquet@ avec une suite de ce style.
Or moi je voudrais que ca m'affiche 100 et 8080!

Je commence a comprendre tes classes modeles et liste. Or meme si dans mon cas l'objet est insere, je n'ai pas demande a ce qu'il s'affiche!!

Je pensais faire une procedure avec le parcours du vector comme quand on remplit une liste ou un combobox en delphi ce genre de chose.
Or ta fonction ajoute, quand je l'utilise, ajoute dans le vector et affiche dans la liste... Juste cela m'affiche pas comme je voudrais (non non je suis pas ennuyeux :-p ).
Je continue d'essayer de comprendre.
Quelle est la fonction qui affiche dans la liste?
Et encore merci mille fois pour ton aide. :big)
Messages postés
261
Date d'inscription
jeudi 5 septembre 2002
Statut
Membre
Dernière intervention
6 octobre 2005
11
En fait, pour ta classe Paquet, il faut que tu redéfinisses la méthode toString, car en fait une JList fait appel à cette méthode pour afficher.
Dans ta classe Paquet (j'insiste sur la majuscule), tu peux par exemple ajouter :
public String toString()
{
   return nombre1+" , "+nombre2;
}

Je supose que nombre1 et nombre2 sont tes champs, à toi de les remplacer par le nom qui va bien.

JHelp
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

OK merci pour ta precieuse aide.
Malheureusement je ne comprend qu'a moitie ton code concernant les ecouteurs ?-) .
Lors d'un changement l'element va etre rajoute a la liste. Or l'affichage est bien une donne de sortie, et doit donc etre de type "return mon_paquet" ou dans mon cas return ma_string.
Or la procedure changement n'indique pas cela.
Quelle est donc la procedure qui affiche l'element dans la liste, et dont je vais pouvoir modifier l'apparence (ici afficher une string).

Encore merci de m'aider. ++
Messages postés
261
Date d'inscription
jeudi 5 septembre 2002
Statut
Membre
Dernière intervention
6 octobre 2005
11
En fait le code de l'écouteur permet de signaler à la JList, "Hé quelque chose à été modifié, met à jour ton affichage", ce qu'elle fait en appelant la méthode toString des éléments contenus à l'intérieur de la liste.
Est-ce clair ?
JHelp
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

Ah ok ouaip c'est clair merci.

Et tout s'affiche bien maintenant!!!! :-p

Cependant j'ai encore une question: on ne peux pas saisir une adresse InetAddress ou un tableau byte[] directement?

InetAddress mon_adresse = new InetAddress(//probleme);
byte[] mon_tableau = new ???

Je dois sinon passer par les fonctions getByName et autre? Si tu pouvais me donner un exemple reel, en tout cas en local ca ne marche pas.

Merci et ++
Messages postés
261
Date d'inscription
jeudi 5 septembre 2002
Statut
Membre
Dernière intervention
6 octobre 2005
11
Je ne comprends pas bien ce que tu entends par saie directement ?
Pour creer un tableau, que se soit de byte, ou d'autre choses, c'est toujours la même façon.
Soit tu connais les éléments qui sont connus dans ton tableau. Et dans ce cas tu peux faire :
byte[] tableau={5,89,-12,56};

Soit tu connais la taille du tableau, mias tu ignores, pour le moment son contenu, et dans ce cas, tu peux faire :
byte[] tableau=new byte[52];

Ou soit tu ne connais, ni la taille, ni son contenu à l'initalisation. Dans ce cas tu peux faire :
byte[] tableau;
//...
//Détermination de la taille
tableau=new byte[taille];


InetAdress, s'inalise de cette facon,
Soit :
InetAdress IP = InetAdress.getByName("127.0.0.0");

Soit :
InetAdress IP = InetAdress.getByName(nomMachine);


où nom machine est une String contenant le nom de la machine.

JHelp
Messages postés
39
Date d'inscription
jeudi 23 janvier 2003
Statut
Membre
Dernière intervention
3 juin 2003

Oui je voulais dire de saisir une variable dont on connaissait deja les donnes, j'utilise cela pour les test.
Merci!

En ce qui concerne la capture des paquets, il n'est donc apparemment pas possible, sur un reseau switche, de les capturer (enfin plutot de les lire) sans passer par une socket configure en "promiscuous".
Cela se fait en C, mais je devrais par la suite utiliser le JNI (Java Native Interfeface) pour importer ce code et l'utiliser dans mon application.
La creation de la socket et la capture des paquets ne peut vraiment pas se faire directement en Java avec le JDK 1.4?? Et si oui alors comment?
Je recherche un algo pouvant me montrer cela.

Merci encore et ++ :)

Jonathan