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 :

JList et son index


Sujet :

Composants Java

  1. #1
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut JList et son index
    Bonjour

    impossible de le faire marcher!
    J'ai un model
    J'ai une JList qui l'utilise
    J'ai un BP qui rempli le model avec 2 textes
    La JList s'affiche bien dans ma JFrame avec les élements.
    Quand je sélectionne l'élement 2 dans la JFrame
    j'affiche bien le nombre d"élement du model
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(modelListeP.getSize());
    par contre le nombre d'éléments dans ListeP est me renvoie
    "java.awt.Dimension[width=0,height=0]"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(listeDesProjets.getSize());
    et si je fait ça, la réaction sur un double click de souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void mouseClicked(MouseEvent arg0) {
    	if (arg0.getClickCount() == 2) {
    BP_ouvrirP.setText(listeP.getModel().getElementAt(listeP.getSelectedIndex()).toString());
    }
    ben c'est pas bon! le tetxte du BP ne reçoit rien

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tout d'abord, JList est un composant Swing : sa méthode getSize() renvoie ses dimensions (largeur et hauteur), pas le nombre d'éléments affichés dans le JList. Tandis que le modèle est de type ListModel, dont la méthode getSize() retourne le nombre d'éléments.

    Ensuite, il faudrait voir précisemment :

    • Où se trouve codée la méthode mouseClicked() ?
    • Est-ce qu'elle est bien exécutée, ce qu'on peut tester en mettant System.out.println("clicked") temporairement dans la méthode ;
    • Où se trouve BP_ouvrirP et qu'est-ce que c'est ? Plus de code serait utile (en particulier comment et où est déclarée cette variable, comment et où est elle initialisée).



    PS : c'est quoi un BP ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Bonjour

    BP, c'est un un Jbouton (Bouton poussoir)

    Où se trouve codée la méthode mouseClicked() ?
    elle se trouve dans le mouseListener qui semble marcher car je peux afficher des messages en réaction aux évènements.

    Est-ce qu'elle est bien exécutée, ce qu'on peut tester en mettant System.out.println("clicked") temporairement dans la méthode ;
    Elle est bien exécuté car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void mouseClicked(MouseEvent arg0) {
    	if (arg0.getClickCount() == 2) {
    System.out.println(modelListeP.getSize());;
    }
    me renvoie bien le nombre d’éléments du modèle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void mouseClicked(MouseEvent arg0) {
    	if (arg0.getClickCount() == 2) {
    System.out.println(arg0);
    }
    me renvoie bien le nombre de click si je click 2 foie par exemple ou même trois si 3 fois si je teste avec 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void mouseClicked(MouseEvent arg0) {
    	if (arg0.getClickCount() == 2) {
    BP_ouvrirP.setText(listeP.getModel().getElementAt(listeP.getSelectedIndex()).toString());
    }
    là, ça marche pas

    la fonction mouseClicked est crée automatiquement par Eclipse quand sur le composant, j'utilise les propriètées,mouse,clicked du JList

    Où se trouve BP_ouvrirP et qu'est-ce que c'est ? Plus de code serait utile (en particulier comment et où est déclarée cette variable, comment et où est elle initialisée).
    Le BP sur trouve sur la JFrame. il va me servir a ouvrir ce que je veux sélectionner dans la JList. Donc je veux récupérer le texte et modifier le texte du BP.

    Plus de code ce soir, suis au boulot maintenant.

    listeP.getSelected() devrait me renvoyer 2 si je suis lsur le deuxième élément ou 1 si premier?

    Merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lio908 Voir le message

    listeP.getSelected() devrait me renvoyer 2 si je suis lsur le deuxième élément ou 1 si premier?
    Le premier est d'index 0 et le second d'index 1 (c'est la plupart du temps comme ça dans les classes de base de Java, à de très rares exceptions près. Il n'y a que les colonnes de ResultSet et la paramètre de PreparedStatement qui me viennent à l'esprit, où le premier est d'index 1).


    Citation Envoyé par lio908 Voir le message
    Le BP sur trouve sur la JFrame. il va me servir a ouvrir ce que je veux sélectionner dans la JList. Donc je veux récupérer le texte et modifier le texte du BP.
    C'est pour voir vraiment comment c'est que je voudrais le code. Regarde cette classe : on a beau appuyer sur le bouton, le texte du label ne change jamais, et pourtant on voit dans la console que la méthode est appelée et le compteur incrémenté !

    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
    public class Demo extends JPanel implements ActionListener {
     
     
    	private JLabel label = new JLabel();
    	private int compteur;
     
    	public Demo() {
    		super(new GridLayout(0,1));
    		JLabel label = new JLabel(String.valueOf(compteur), JLabel.CENTER);
    		JButton button = new JButton("+1");
    		button.addActionListener(this);
    		add(label);
    		add(button);
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		compteur++;
    		System.out.println("Nouveau compteur: " + compteur);
    		label.setText(String.valueOf(compteur));
    	}
     
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.add(new Demo());
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Dans la JFrame
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	DefaultListModel<String> modelListeP = new DefaultListModel<String>();
    	JList<String> listeP = new JList<String>(modelListeP);
    Quand j'ouvre la Jframe, je replis le modèle avec des infos sous forme de String.
    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
     
    					public pagePrincipale() throws ClassNotFoundException, FileNotFoundException, IOException {
    		addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowOpened(WindowEvent arg0) {
    				/*
    				 * regarde les repertoires existant sous la racine de l'appli 1
    				 * repertoire par projet
    				 */
    				modelListeP.clear();
    				listeP = new JList();
    				String repertoire = System.getProperty("user.dir");
    				File file = new File(repertoire + "\\p");
    				File[] files = file.listFiles();
    				if (files != null) {
    					for (int i = 0; i < files.length; i++) {
    						if (files[i].isDirectory() == true) {
    							// System.out.println("Dossier: " +
    							// files[i].getAbsolutePath());
    							String nom = files[i].getAbsolutePath().toString();
    							modelListeP.addElement(files[i].getAbsolutePath().toString());
    						}
    					}
    				}
    			}
    		});
    BP_ouvrir est un JButton d'un Jframe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		final JButton BP_ouvrirP = new JButton("?");
    		panel.add(BP_ouvrirP);
    		listeP.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent arg0) {
    				if (arg0.getClickCount() == 2) {
    					//System.out.println(modelListeDesProjets.getSize());
    					//System.out.println(listeDesProjets.getSize());					
    					BP_ouvrirP.setText(listeP.getModel().getElementAt(listeP.getSelectedIndex()).toString());
    				}
    			}
    		});
    comme dis précédemment, qi double click, si j'affiche arg0, j'ai bien 2 par exemple.
    Donc j'arrive pas a récupérer l'index (0 ou 1 pour 2 élément du modèle) de la JList pour m'en servir pour récupérer la valeur dans le modèle.

    merci

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    D'après cet extrait de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DefaultListModel<String> modelListeP = new DefaultListModel<String>();
    	JList<String> listeP = new JList<String>(modelListeP);
    Tu créés une JList et un modèle pour celle-ci, stockés en variables de classe, donc à priori celles manipulées dans ce bout code (je ne peux que supposer vu que j'ai des extraits de code disparates) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    final JButton BP_ouvrirP = new JButton("?");
    		panel.add(BP_ouvrirP);
    		listeP.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent arg0) {
    				if (arg0.getClickCount() == 2) {
    					//System.out.println(modelListeDesProjets.getSize());
    					//System.out.println(listeDesProjets.getSize());					
    					BP_ouvrirP.setText(listeP.getModel().getElementAt(listeP.getSelectedIndex()).toString());
    				}
    			}
    		});

    Mais dans ce code, à l'ouverture de la fenêtre :

    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
    addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowOpened(WindowEvent arg0) {
    				/*
    				 * regarde les repertoires existant sous la racine de l'appli 1
    				 * repertoire par projet
    				 */
    				modelListeP.clear();
    				listeP = new JList();
    				String repertoire = System.getProperty("user.dir");
    				File file = new File(repertoire + "\\p");
    				File[] files = file.listFiles();
    				if (files != null) {
    					for (int i = 0; i < files.length; i++) {
    						if (files[i].isDirectory() == true) {
    							// System.out.println("Dossier: " +
    							// files[i].getAbsolutePath());
    							String nom = files[i].getAbsolutePath().toString();
    							modelListeP.addElement(files[i].getAbsolutePath().toString());
    						}
    					}
    				}
    			}
    		});
    1. Tu vides le modèle ( appel de clear() )
    2. tu remplaces l'instance de JList contenue dans la variable de classe par une nouvelle instance sans modèle et qui n'est affichée nulle part (appel de new JList())
    3. puis tu remplis le modèle


    Donc :

    1. Il y a toujours une JList affichée dans ta JFrame : la première que tu as créée au tout début ;
    2. Le modèle est toujours le même, donc vidé, puis remplie à nouveau avec des nouvelles valeurs, donc cette JList affiche bien tes nouveaux items ;
    3. puis tu doubles-cliques, donc mouseClicked() est exécuté, et fait appel à un JList qui est stocké dans la variable de classe, qui n'est pas celui qui est affiché, mais un autre, affiché nulle part, donc sans sélection aucune, et recréé sans modèle (donc vide), à chaque ouverture d'une fenêtre


    Supprime tout simplement la ligne avec new JList() dans windowOpened() qui ne sert à rien, et qui occulte dans la variable listeP la JList réellement utilisée (affichée et cliquée). C'est une variante du problème que je soulevais dans mon exemple de code (avec le JLabel).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Bonsoir et merci, ça marche.

    Effectivement Eclipse met un code couleur bleu sur le deuxième listeP = new JList()
    et quand je recherche la déclaration en cliquant sur ce deuxième Jlist, cela me renvoie au premier.
    Ni y a t il pas un petit pb?
    lors de la deuxième écriture du listep, Eclipse aurait du me dire que cette déclaration existait déja et me l'interdire.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lio908 Voir le message
    lors de la deuxième écriture du listep, Eclipse aurait du me dire que cette déclaration existait déja et me l'interdire.
    Il n'y a strictement aucune raison de l'interdire de manière générale : on peut même utiliser judicieusement ce genre de chose habituellement. Simplement, ça ne fonctionne pas avec un composant Swing déjà affiché (si le remplaçait explicitement dans son container et ça fonctionnerait) : mais ça le compilateur (et non pas Eclipse) ignore totalement cette spécificité et d'ailleurs n'a pas à la connaitre.

    Tu peux éventuellement déclarer final la variable de classe : si tu l'avais fait, tu n'aurais pas pu compiler la classe, parce que le compilateur aurait "su" justement qu'on interdisait explicitement de remplacer la valeur (la référence de la première instance de JList) de la variable de classe par une nouvelle valeur.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    OK merci pour la notion de final
    Je solde le sujet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/07/2007, 20h53
  2. acces à un iterateur de vecteur par son index
    Par koala01 dans le forum C++
    Réponses: 11
    Dernier message: 25/11/2006, 10h17
  3. [VBA-E] référence colonne en fonction de son index et inversement
    Par gapgap dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/05/2006, 13h39
  4. [DLL] Acces a une methode par son index de maniere dynamique
    Par Clorish dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 11/03/2005, 17h14
  5. Réponses: 2
    Dernier message: 10/05/2004, 11h20

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