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 :

[Debutant][JTable] Dimensionement des colones, et autre soucis.


Sujet :

Composants Java

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut [Debutant][JTable] Dimensionement des colones, et autre soucis.
    Bonjour, voila devant effectuer des changement sur une base de données, je me suis naturelement tourné vers une Jtable.
    Aprèys une après midi passé a parcourir divers forum, google et autre notice made in sun, j'ai compris plusieurs chose, mais je n'arrive pas a les implementer (oui en fait je n'ai rien compris).
    Tout d'abord, je créée ma table de la manière suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TableModel tableModaliteModel = new DefaultTableModel(
                                        new String[][] {},
                                        new String[] { "Type", "Rang", "Code", "Intitulé modalité", "Nombre" });
     
    tableModalite=new JTable();
                                    panelModalite.setViewportView(tableModalite);
                                    tableModalite.setModel(tableModaliteModel);
    Puis pour mes redimensionements ou changement particuliers je fais ceci

    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
     
    TableColumn colone;
                                    TableColumn coloneTypeModalite = tableModalite.getColumnModel().getColumn(0);
                                    JComboBox jcb = new JComboBox();
                                    jcb.addItem("E");
                                    jcb.addItem("M");
                                    jcb.addItem("U");
                                    coloneTypeModalite.setCellEditor(new DefaultCellEditor(jcb));
     
     
                                    colone=tableModalite.getColumnModel().getColumn(0);
                                    colone.setWidth(panelModalite.getWidth()*14/100);
                                    colone=tableModalite.getColumnModel().getColumn(1);
                                    colone.setWidth(panelModalite.getWidth()*14/100);
                                    colone=tableModalite.getColumnModel().getColumn(2);
                                    colone.setWidth(panelModalite.getWidth()*25/100);
                                    colone=tableModalite.getColumnModel().getColumn(3);
                                    colone.setWidth(panelModalite.getWidth()*33/100);
                                    colone=tableModalite.getColumnModel().getColumn(4);
                                    colone.setWidth(panelModalite.getWidth()*14/100);
    Autant ca marche pour le ComboBox, autant pour le redimensionement non.

    J'aurais également voulu savoir, au niveau algorythme et propreté.
    Si on effectue un changement dans ma table, il faut que cela se répercute dans ma bd. Est ce que la possibilité suivante marcherait :
    Je crée un KeyListener sur tout ma table, et à chaque fois qu'on appuie sur la touche entré alors qu'on a une cellule de selectionnée cela envoit la requete au niveau de la BD. Ou ya il plus propre ?

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    le meilleur moyen de réagir aux changement de données dans la JTable est d'ajouter un TableModelListener au TableModel.
    Concernant le redimensionnement, il faut appeler setPreferredWidth plutôt que setWidth.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    J'ai essayé avec les deux, setPreferredWidth et setWidth, mais aucun des deux ne change ma taille. J'ai inclue mon Jtable dans un JscrollPane, lui inclue dans le centre d'un borderLayout.
    Sinn merci pour l'evenement, je vais voir de ce coté là.

  4. #4
    Membre éclairé Avatar de cysboy
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 221
    Par défaut
    Ce code marche très bien chez moi:
    table étant ma JTable possédant 5 colonnes. Ici je ne redimensionne que la première.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     TableColumn column = null;
    for (int j = 0; j < 5; j++) {
        column = table.getColumnModel().getColumn(j);
     
        if (j == 0)
          column.setPreferredWidth(350);
     
        else
          column.setPreferredWidth(50);
    }

  5. #5
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Ah, oui. En fait, lorsque tu appelles setPreferredSize, panelModalite n'a pas encore été affiché ni "layouté". Sa taille n'a pas encore été calculée et vaut 0x0.

    Pour faire ce que tu cherches, tu peux rentrer les coordonnées en dur (14, 14, 25, ...), et appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableModalite.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    Ce qui d'après la javadoc devrait respecter les tailles relatives des colonnes lorsque la JTable est redimensionnée.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Merci bien c'était bien ca. Je me suis arrangé en utilisant la taille de ma frame général ce qui convient à ce que je recherche.
    Merci beaucoup ^^

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Je relance le sujet, car j'ai encore un souci.
    Dés que je fais un fireTableStructureChanged, la structure de mes colones reviennent par défaut, taille ou editor.
    C'est normal, ou je n'ai pas bien fais quelque chose dés le départ ?

  8. #8
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    On peut voir le code dans son état actuel ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  9. #9
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Alors, ceci est pour la création de ma 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
     
     
     
     
    	TableauQuestionTableModel tableModaliteModel = new TableauQuestionTableModel();
     
    	tableModaliteModel.addTableModelListener(new TableModelListener()
    	{
    		public void tableChanged(TableModelEvent e) 
    		{
    			actionChangementTableau();
    		}
    	});
     
    	ArrayList listColone=tableModaliteModel.getColumnNames();
    	listColone.add("Type");
    	listColone.add("Rang");
    	listColone.add("Code");
    	listColone.add("Libelle");
    	listColone.add("Nombre");
    	tableModalite=new JTable();
    	panelModalite.setViewportView(tableModalite);
    	tableModalite.setModel(tableModaliteModel);
    	tableModalite.addMouseListener(new MouseAdapter() 
    	{
    		public void mouseReleased(MouseEvent evt) 
    		{
    			tableModaliteMouseReleased(evt);
    		}
    		public void mousePressed(MouseEvent evt) 
    		{
    			tableModaliteMousePressed(evt);
    		}
     
    		});
     
    	TableColumn coloneTypeModalite = tableModalite.getColumnModel().getColumn(0);
    	JComboBox jcb = new JComboBox();
    	jcb.addItem("E");
    	jcb.addItem("M");
    	jcb.addItem("U");
     
    	coloneTypeModalite.setCellEditor(new DefaultCellEditor(jcb));
     
     
    	TableColumn colone;
    	colone=tableModalite.getColumnModel().getColumn(0);
    	//colone.setPreferredWidth(10);
    	colone.setPreferredWidth(this.getWidth()*7/100);
    	colone=tableModalite.getColumnModel().getColumn(1);
    	colone.setPreferredWidth(this.getWidth()*7/100);
    	colone=tableModalite.getColumnModel().getColumn(2);
    	colone.setPreferredWidth(this.getWidth()*17/100);
    	colone=tableModalite.getColumnModel().getColumn(3);
    	colone.setPreferredWidth(this.getWidth()*60/100);
    	colone=tableModalite.getColumnModel().getColumn(4);
    	colone.setPreferredWidth(this.getWidth()*10/100);
     
     
     
     
    }


    Et ceci est un copier collé entier de mon model :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
     
    package ihm;
     
    import java.util.ArrayList;
    import java.util.Iterator;
     
    import javax.swing.table.AbstractTableModel;
    /**
     * Classe TableauQuestionTableModel etendu de AbstractTableModel. 
     * Permet de redefinir les attribut ligne et colone en des list, ce permettant d'ajouter et de supprimer facilement des lignes à notre tableau. 
     * @author DJOBIRD
     *
     */
    public class TableauQuestionTableModel extends AbstractTableModel 
    {
    	private ArrayList data = new ArrayList();
    	public ArrayList columnNames = new ArrayList();
     
     
    	/**
             * Permet l'ajout d'une ligne. Va décaler le rang et la position dans la liste si la ligne est inseer au milieu
             * @param ligne
             * @param listElements
             */
    	public void addNewRow(int ligne, ArrayList listElements ) 
    	{
    		int i;
    		for(i=0; i<listElements.size(); i++)
    		{
    			String temp = (String)listElements.get(i);
    			if (temp==null) temp="";
    		}
     
    			if(ligne==-1) ligne++;
    			data.add(ligne, listElements);
     
    		this.fireTableStructureChanged();
    	}
     
     
     
     
     
     
    	/**
             * Permet la suppresion d'une ou plusieurs lignes. Va décaler le rang et la position dans la liste si  les lignes supprimé sont au milieu
             * @param lignes
             */
    	public void removeRow(int[]lignes) 
    	{
    		if(!(getRowCount()==0))
    		{
    			//On supprime toute les lignes selectionnées
    			int i;
    			for(i=lignes.length-1; i>=0; i--)
    			{	
    				if ( lignes[i]>=0)
    					data.remove(lignes[i]);
    			}
     
    		}
     
     
     
    	}
     
     
    	public int getColumnCount() 
    	{
    		return columnNames.size();
    	}
     
    	public int getRowCount() 
    	{
    		return data.size();
    	}
     
    	public String getColumnName(int col) 
    	{
    		return (String)columnNames.get(col);
    	}
     
    	public String getValueAt(int row, int col) 
    	{
    		ArrayList o=(ArrayList)data.get(row);
    		return (String)(o.get(col));
     
    	}
     
    	public Class getColumnClass(int c) 
    	{
    		return getValueAt(0,c).getClass();
    	}
     
    	public boolean isCellEditable(int row, int col) 
    	{return (col < 2);
     
    	}
     
    	public void setValueAt(String value, int row, int col) 
    	{
    		ArrayList o=(ArrayList)data.get(row);
    		o.set(col, value);
     
    		fireTableCellUpdated(row,col);
    	}
     
     
    	public ArrayList getData() {
    		return data;
    	}
     
     
    	public void setData(ArrayList data) {
    		this.data = data;
    	}
     
     
     
     
     
     
    	public ArrayList getColumnNames() {
    		return columnNames;
    	}
     
     
     
     
     
     
    	public void setColumnNames(ArrayList columnNames) {
    		this.columnNames = columnNames;
    	}
     
     
     
    }

  10. #10
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    As-tu essayé d'ajouter le AUTO_RESIZE_ALL_COLUMNS dont je parle plus haut ? Je pense que ça devrait aider.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Oui pardon j'aurais du préciser, mais soit je le place mal soit ca ne marche pas non plus. Mais il 'y a pas que la taille. Il ya aussi les editors qui virent.
    Le comboox que je met sur la 1er colone n'est plus actif, de même que je ne peux plus editer d'aucune manière que ce soit mes cellules.
    Mais cela "bug" que si j'effectue mon ajout de ligne après avoir redimensionner ou changer les editor/renderer.
    Alors je pense qu'en effectuant les redimensionement et autres à chaque fois que j'ajoute ou supprime une ligne pourrait peut être marché, mais j'aimerais quelque chose de plus propre quand même.

  12. #12
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Je continue dans la joie et la bonne humeur, ayant d'autres soucis avec mes Jtables.
    Ce n'est pas sur la même Jtable, même si elle utilise le même model. Je n'ai fais encore aucun changement sur les colones. Je veux implenter plusieurs type de clic dessus. Notament un double clic. Et cela ne marche pas très bien, il ne detecte un double clic que si j'utilise le clic de la molette. Cela va marché également si je clic sur une colone non éditable (pourquoi est ce que cette colone est non éditable alors que les autres oui, ca je ne sais pas ...).

    Voici le code pour cette 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
     
    TableauModel tableauQuestionsModel = new TableauModel();
    	ArrayList listColone=tableauQuestionsModel.getColumnNames();
    	listColone.add("Rang :");
    	listColone.add("Code :");
    	listColone.add("Libelle :");
    	tableQuestions = new JTable();
    	panelTableauQuestions.setViewportView(tableQuestions);
    	tableQuestions.setModel(tableauQuestionsModel);
     
    	tableQuestions.addMouseListener(new MouseAdapter() 
    	{
    		public void mouseReleased(MouseEvent evt) 
    		{
    			tableQuestionsMouseReleased(evt);
    		}
    		public void mousePressed(MouseEvent evt) 
    		{
    			tableQuestionsMousePressed(evt);
    		}
    		public void mouseClicked(MouseEvent evt) {
    			tableauQuestionsMouseClicked(evt);
    		}
     
    		});

  13. #13
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bon, j'ai du mal à suivre le tout, alors voici l'ensemble de mes remarques, à toi de voir si elles sont pertinentes :
    - ton TableModel ne m'a pas l'air bien différent d'un DefaultTableModel. Pourquoi réinventer la roue ? Il serait aussi simple et peut-être plus fiable d'utiliser un DefaultTableModel.
    - le dimensionnement des colonnes est effectué dans la méthode doLayout. Si tu continues à avoir des problèmes de largeur, tu peux surcharger cette méthode pour être sûr que les colonnes seront toujours proportionnelles.
    - ton problème d'Editor, j'ai vraiment du mal à voir d'où il peut venir. Tu peux au choix définir les Renderers/Editors par colonne ou bien selon la classe de l'objet contenu dans la case. Si les solutions au-dessus ne marchent pas, tu peux essayer de creuser dans cette direction.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  14. #14
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    J'ai finis par trouver.
    J'avais pourtant déjà testé cette solution, mais j'avais mal du le faire je pense, quand j'insere/supprime une ligne je fais un fireTableStructureChanged();, ce qui
    veut bien dire que la strucuture à changé, en le remplacant par un simple
    fireTableRowsInserted(ligne,ligne); cela marche très bien. ^^
    Merci bien pour les réponses dans tout les cas ^^

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

Discussions similaires

  1. [JTable] coloration des lignes d'une JTable
    Par MathiasM dans le forum Composants
    Réponses: 3
    Dernier message: 22/06/2009, 10h19
  2. Réponses: 9
    Dernier message: 24/05/2006, 08h55
  3. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 10h14
  4. [debutant] Comment ajouter des .class ?
    Par Slein dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 30/04/2004, 14h30
  5. [debutant][JNI]Stocker des objet pour les rappeler plus tard
    Par Celenor dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 28/03/2004, 01h28

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