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 :

Passer d'un GridLayout à un JTable


Sujet :

Composants Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut Passer d'un GridLayout à un JTable
    Bonjour,
    j'utilise actuellement un GridLayout de trois colonnes pour afficher des données.
    Seulement, je me suis rendu compte que ce Layout n'était pas très modulable. On ne peut par exemple pas faire varier la taille des colonnes.

    Je voudrai donc pouvoir remplacer mon GridLayout par un JTable, mais je ne vois pas trop comment remplir le tableau de données.

    Voici mon code actuel :
    Code java : 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
     
    Box vbox = Box.createVerticalBox();
    for (int i = 0; i < arraylist.size(); i++) {
    	JPanel jp = new JPanel();
    	jp.setBorder(BorderFactory.createTitledBorder(arraylist().get(i)
    			.getNom()));
    	GridLayout gl = new GridLayout(arraylist.get(i).getDonnees().size(), 3);
    	jp.setLayout(gl);
     
    	for(Map.Entry<String, String> entry : arraylist.get(i).getDonnees().entrySet() ) {
    		JLabel label = new JLabel(entry.getKey());
    		JTextField textField = new JTextField(entry.getValue());
    		jp.add(label);
    		jp.add(textField);
    		arrayJt.add(textField);
    	}
    	vbox.add(jp);
     
    }
    Est-il possible de remplacer facilement le GridLayout par un JTable?

    Merci

  2. #2
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Citation Envoyé par floctc Voir le message
    Est-il possible de remplacer facilement le GridLayout par un JTable?
    Bigre ! Ca n'a rien à voir.
    Oublie ton gridbaglayout et construit la table from scratch. C'est facile. Regarde le tuto Swing chez Java.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    Oui, il ne s'agit pas de la même chose, dans un cas c'est un Layout et dans l'autre c'est un composant, mais j'utilise le GridLayout comme un tableau.

    Je voudrai savoir comment transformer les données de ma LinkedHashMap en Object, afin d'obtenir un tableau d'object que je pourrai directement passer au constructeur de mon JTable.

    Vu comment je construis ma boucle, cela est-il possible?
    Je ne voudrai pas avoir à tout recoder...

    Merci

  4. #4
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Tu dois alors développer ton propre modèle de table.
    C'est plutôt facile.

    Il faut notamment implémenter
    public int getRowCount();
    public int getColumnCount();
    public Object getValueAt(int row, int column);


    auxquels tu réponds en te basant sur ton arraylist et ton linkedhashmap.
    La seule difficulté que je vois c'est peut-être ta LinkedHashMap. Tu devrais la remplacer par une List parce que c'est plus facile à accéder via un index numérique comme le sont row et column.

    Après t'as intérêt a implémenter
    getColumnClass(int columnIndex), pour indiquer le type de chaque colonne. Ca aide la jTable à te fournir le bon éditeur
    getColumnName(int column), pour indiquer le nom de chaque colonne, sinon tu as des noms par défaut "A", "B", ...
    isCellEditable(int rowIndex, int columnIndex) pour indiquer les cellules pour lesquels la jTable doit basculer entre le "renderer" et l' "editor"
    setValueAt(Object aValue, int rowIndex, int columnIndex) pour indique ce qu'il faut faire des valeurs modifiées des cellules éditables (ex les rebalancer dans ta arraylist)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    Merci pour ton explication.

    Je suis parti voir un tutoriel sur les TableModel. Ca n'a pas l'air très compliqué.
    Par contre, à chaque fois dans les exemples, les tableaux sont écrits en dur dans le code, ou générés à partir d'objets.


    Le souci, c'est que moi je ressort chaque élément directement dans la boucle.

    Je récupère ces éléments de ma linkedHashMap, et je ne peux pas changer ce type, ça aurait trop d'impact.

    Je donne un exemple d'une classe fichier représentant un fichier properties. C'est à partir de là que je récupère des éléments pour mon JTable.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    public class Fichier {
     
    	private String nom;
    	private LinkedHashMap<String, String> donnees = new LinkedHashMap<String, String>();
     
    	public Fichier(String nom, LinkedHashMap<String, String> donnees) {
    		super();
    		this.nom = nom;
    		this.donnees = donnees;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public LinkedHashMap<String, String> getDonnees() {
    		return donnees;
    	}
     
    	public void setDonnees(LinkedHashMap<String, String> donnees) {
    		this.donnees = donnees;
    	}
     
    	/**
             * affiche proprement la liste des elements de la LinkedHashMap (suppression des accolades...)
             * nb : possibilité d'utiliser également Map.Entry et entrySet(), mais charge plus lourde dans le code
             * @return la chaine de caractère nettoyée.
             */
    	public String toString() {
    		String str = "";
    		String tab[] = donnees.toString().split(",");
     
    		for (int i = 0; i < tab.length; i++) {
    			tab[i] = tab[i].trim();
    			str += tab[i] + "\n";
    		}
    		str = str.replace("{", "");
    		str = str.replace("}", "");
    		return str;
    	}
     
    	/**
             * convertit la LinkedHashMap en un tableau (pour pouvoir ensuite recuperer
             * la clé ou la valeur, avec split("=")
             * 
             * @return un tableau contenant les associations clé-valeur en un seul
             *         string
             */
    	public String[] getString() {
    		String str = donnees.toString();
    		str = str.replace("{", "");
    		str = str.replace("}", "");
    		String tab[] = str.split(",");
    		return tab;
    	}
     
    }
    Est-il possible, à partir de cette classe, de remplir mon JTable?

    Je commence à douter là, je ne voudrai pas avoir à tout recoder ou passer pl, car la gridLayout convient bien ici (tableau à 2 ou 3 colonnes). Le seul problème, c'est la taille des colonnes non paramétrable...

    Merci de votre aide

  6. #6
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    C'est difficile de te répondre tant que tu n'expliques pas le layout de ta table. Quelle colonne reprend quoi ? Une ligne reprend quoi ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    La première colonne est un label qui reprend le nom du paramètre (le entry.getKey() de ma LinkedHashMap).

    La deuxième colonne contient la valeur du paramètre (le entry.getValue() ).

    De cette manière, on voit bien apparaitre la valeur associée à la propriété.
    Le souci, c'est que la valeur peut être un texte important, et donc le gridLayout agrandit les colonnes pour faire apparaitre tout le JTextField.

    Comme les colonnes du gridLayout sont de même taille, le label prend lui aussi beaucoup de place (alors que ce n'est pas nécessaire), et l'affichage n'est vraiment pas optimisé.

    Existe-t-il une solution?

  8. #8
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    C'est un tableau à 2 colonnes et x lignes (le arraylist du début n'a pas d'influence sur le tableau ?)
    Si c'est "que ça", je pense que tu peux t'en sortir avec un GridBagLayout, en jouant avec weightx=0 pour la 1ère colonne et weightx=100 pour la deuxième.
    Evidemment avec les jTable en java 1.6, tu peux avoir la largeur interactive, le tri et le filtre intégré sans plus de développement.
    Par contre, plus j'y pense plus que je crois que ta LinkedHashMap ne le fera pas ! Car le principe de la jTable c'est de pouvoir tout accéder par des coordonnées x,y. Or avec une LinkedHashMap tu ne peux pas faire un get de l'élément n° x.
    C'est si compliqué de remplacer le LinkedHashMap par un ArrayList ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    Le ArrayList du début contient des objets de type Fichier, qui eux mêmes contiennent la LinkedHashMap nécessaire pour remplir le tableau.

    Je vais voir si un gridBagLayout ferait l'affaire, mais on m'a déconseillé de l'utiliser...

    Je voudrai bien utiliser le JTable, c'est vrai que ça serait beaucoup plus propre.
    Mais je ne vois vraiment pas comment faire avec mon code existant, et je ne peux pas remplacer ma LinkedHashMap par un ArrayList. J'ai besoin d'associer la clé a une valeur.

    Merci pour ton aide, en tous cas.

  10. #10
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Citation Envoyé par floctc Voir le message
    je ne peux pas remplacer ma LinkedHashMap par un ArrayList. J'ai besoin d'associer la clé a une valeur.
    Tu utilises une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<AbstractMap.SimpleEntry<String,String>>
    Voir AbstractMap.SimpleEntry

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    En utilisant cette ArrayList, comment je fais après pour l'associer à un JTable?

    Ca me semble une bonne solution, même si apparemment le GridBagLayout pourrait aussi faire l'affaire.

  12. #12
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu crées ton propre modèle en te basant sur la classe AbstractTableModel

    Cf le tuto que tu as déjà regardé.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    Bonjour,
    merci pour votre aide.

    J'ai finalement réussi à obtenir ce que je voulais en utilisant des vertical Box :

    Code java : 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
     
    for (int i = 0; i < ArrayList.size(); i++) {
    	JPanel jp = new JPanel();
    	jp.setBorder(BorderFactory.createTitledBorder(ArrayList.get(i)
    					.getNom()));
    	Box vbox2 = Box.createVerticalBox();
    	Box vbox3 = Box.createVerticalBox();
     
    	for(Map.Entry<String, String> entry : ArrayList.get(i).getDonnees().entrySet() ) {
    		JLabel label = new JLabel(entry.getKey());
    		JTextField textField = new JTextField(entry.getValue());
    		vbox2.add(label);
    		vbox3.add(textField);
    	}
    	jp.add(vbox2);
    	jp.add(vbox3);
    	vbox.add(jp);
    }

    Je m'intéresserai au JTable prochainement, mais là je ne voulais pas tout avoir à recoder.

    J'essaierai bientôt en passant par un AbstractMap.SimpleEntry(), car j'aimerai bien progresser avec les JTable.

    Merci à tous

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 26/03/2015, 10h31
  2. Passer variables d'une JTable à une autre sur un Joptionpane
    Par laplumedoie dans le forum Débuter
    Réponses: 4
    Dernier message: 28/02/2014, 18h58
  3. Passer du Pascal à Delphi
    Par poppels dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2002, 21h07
  4. Réponses: 9
    Dernier message: 12/08/2002, 07h38
  5. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/05/2002, 23h05

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