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 :

[JTable] et le rafrichissement aprés l'ajout et suppression


Sujet :

Composants Java

  1. #1
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut [JTable] et le rafrichissement aprés l'ajout et suppression
    Bonjour,
    voila ce que je veux faire c'est pouvoir ajouter des lignes : pour cela le bouton addCopy : ajoute une copie de la derniere ligne à la fin de JTable si celle ci est pleine.
    add: ajoute une ligne vide toujours à la fin
    del : supprime toujours le dernier element.
    jusqu'a la ca marche bien mais quand je tri les lignes je perd completement l'ordre de mes lignes du coup j'ajoute plus et je supprime plus la ou je veux.
    En plus de tout ça, la regle est que toute les cellules au depart ne sont pas editables sauf celles de la derniere colonnes et pour toute autre ligne ajoutée(copie ou vide) les toutes cellules sont editables, et ça c mon second souci.
    je me ramene pas qu'avec des problemes mais j'ai beau chercher et j'ai trouvé des solutions comme :
    fireTableCellUpdated(row, col);
    fireTableDataChanged();
    mais malheuresement je suis novice avec Jtable.
    voici et franchement merci bcp (et oauiii c la periode des proj mdrr)
    voici le code source : (je suis au TOUT debut mdrr)
    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
     
    public class Test extends javax.swing.JFrame {
    	private JScrollPane jscrollp;
    	private JTable table;
    	private JPanel jp;
    	private int CountRowsInit;
    // le model
    	DefaultTableModel model = new DefaultTableModel() {
    		public boolean isCellEditable(int row, int col) { // OK pour abstract
    			fireTableCellUpdated(row, col);
    			fireTableDataChanged();
    			if (row < CountRowsInit)
    				return (col < (table.getColumnCount() - 1)) ? false : true;
    			return true;
    		}
     
    	};
    	Object[][] cellData = {
    			{ "1-1", "1-2", "1-3", "1-4", "1-5","1-6" },
    			{ "2-1", "1-2", "1-3", "1-4", "1-5","1-6" },
    			{ "3-1", "1-2", "1-3", "1-4", "1-5","1-6" },
    			{ "4-1", "1-2", "1-3", "1-4", "1-5","1-6" },
    			{ "5-1", "1-2", "1-3", "1-4", "1-5","1-6" },
    			{ "6-1", "1-2", "1-3", "1-4", "1-5","1-6" }};
    	String[] columnNames = { "col1", "col2", "col3", "col4", "col5", "col6" };
     
    	public Test() {
    		super("Table");
    		// Create a table with initial data
    		Vector<Object> rowData = new Vector<Object>();
    		initDataInTab(rowData, cellData);
    		Vector<String> columnNamesV = new Vector<String>(Arrays
    				.asList(columnNames));
     
    		table = new JTable(model);
    		model.setDataVector(rowData, columnNamesV);
    // pour le tri !!!
    		table.setAutoCreateRowSorter(true);
    		CountRowsInit = cellData.length;
    		jscrollp = new JScrollPane(table);
    		jp = new JPanel();
    		// Create an action
    		Action actionAdd = new AbstractAction("addCopy") {
    			private static final long serialVersionUID = 1L;
     
    			// This method is called when the button is pressed
    			public void actionPerformed(ActionEvent evt) {
    				if (table.getRowCount() > 0) {
    					/* Pour ajouter une copy ligne avec des données connus */
    					model.insertRow(0, copyRowAt(table.getRowCount() - 1));
    					printDebugData(table);
    				} else {
    					model.addRow(emptyRow());
    					printDebugData(table);
    				}
    			}
    		};
    		Action actionDel = new AbstractAction("Del") {
    			private static final long serialVersionUID = 1L;
     
    			// This method is called when the button is pressed
    			public void actionPerformed(ActionEvent evt) {
    				if (table.getRowCount() != 0) {
    					model.removeRow(table.getRowCount() - 1);
    					printDebugData(table);
    				}
    			}
    		};
    		Action actionEmp = new AbstractAction("Emp") {
    			private static final long serialVersionUID = 1L;
     
    			// This method is called when the button is pressed
    			public void actionPerformed(ActionEvent evt) {
    				model.insertRow(table.getRowCount(), emptyRow());
    				printDebugData(table);
    			}
    		};
    		// Create the button
    		JButton buttonAdd = new JButton(actionAdd);
    		JButton buttonDel = new JButton(actionDel);
    		JButton buttonEmp = new JButton(actionEmp);
    		jp.add(buttonAdd);
    		jp.add(buttonDel);
    		jp.add(buttonEmp);
    		jp.setOpaque(true);
    		jp.add(jscrollp, BorderLayout.CENTER);
    		getContentPane().add(jp);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setVisible(true);
    		setBounds(100, 100, 500, 500);
    	}
     
    	/* transforme le tableau cellData en un tableau de vecteur -d'objet rowData- */
    	private void initDataInTab(Vector<Object> rowData, Object[][] cellData) {
    		for (int i = 0; i < cellData.length; i++) {
    			Vector<Object> colData = new Vector<Object>(Arrays
    					.asList(cellData[i]));
    			rowData.add(colData);
    		}
    	}
     
    	private Vector<Object> copyRowAt(int row) {
    		Vector<Object> data = model.getDataVector();
    		Vector<Object> copy = (Vector<Object>) data.elementAt(row);
    		copy = (Vector<Object>) copy.clone();
    		return copy;
    	}
     
    	private Vector<Object> emptyRow() {
    		Vector<Object> ligneVide = new Vector<Object>();
    		for (int i = 0; i < table.getRowCount(); i++)
    			ligneVide.add(" ");
    		return ligneVide;
    	}
     
    	private void printDebugData(JTable table) {
    		int numRows = table.getRowCount();
    		int numCols = table.getColumnCount();
    		javax.swing.table.TableModel model = table.getModel();
     
    		for (int i = 0; i < numRows; i++) {
    			System.out.print("    row " + i + ":");
    			for (int j = 0; j < numCols; j++) {
    				System.out.print("  " + model.getValueAt(i, j));
    			}
    			System.out.println();
    		}
    		System.out.println("--------------------------");
    	}
     
    	/**
             * Auto-generated main method to display this JFrame
             */
    	public static void main(String[] args) {
    		Test inst = new Test();
    		inst.setVisible(true);
    	}
     
    }
    j'espere avoir ete le plus clair possible.
    à vous.
    merci

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Les méthodes fireXXX n'ont strictement rien à faire dans la méthode isCellEditable. Ces méthodes permettent d'avertir la JTable que des données ont changées et qu'il faut mettre à jour l'affichage.

    De plus, c'est un peu le bordel ton code. Il faudrait que tu fasses un vrai modèle, avec les données à l'intérieur et tu ajoutes des méthodes add, copy, remove dans ton modèle et c'est à ce moment-là que tu vas utiliser les méthodes fireXXX.

  3. #3
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut
    oui mais dans ce cas quand je ferai le tri avec table.setAutoCreateRowSorter(true) qui gere à ce moment les indices de ma JTable je m'explique :
    quand je tri je perd l'ordre des indices du coup quand je remove une ligne c'est une autre que je remove et c'est vraiment le bordel !
    du coup dois je travaillé ur le modele ou la table (la vue ou le modele ?)
    et puis je vois pourquoi dois je faire un modele l'abstract modele me suffit largement vue que je surcharge la methode isCellEditable c'est tout ce que je veux.

    Merci à vous.

    je commence à regretter SWING !

  4. #4
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Bonsoir,
    il faut comprendre une chose:
    si la JTable n'est pas triée, la vue corresponds exactement au modèle, donc quand tu ajoutes une ligne, elle apparait en dernier de la table,
    maintenant, si elle est triée et que tu ajoutes un élément au modèle, là, puisque le tri est activé, le RowSorter (qui représente les indices du modèle mais selon un ordre choisit) rafraichira immédiatement la vue pour que le nouvel élément ajouté corresponde bien au tri.

    pour que tu supprimes la bonne valeur (lorsque la table est triée), il faut récuperer la ligne en faisant ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	int indice =convertRowIndexToModel(ligneSelctionnee)
    ensuite faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.removeRow(indice);

  5. #5
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Autre chose, tu veux supprimer la dernière ligne de la Table même quand elle est triée, je crois !!

    la, il faut jouer avec le modèle de tri, càd: le RowSorter . tu peux récuperer la dernière ligne en faisant ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int indice = taTable.getRowSorter().convertRowIndexToModel(taTable.getRowCount());
    à vérifier !!

  6. #6
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut
    bonsoir,
    Merci bcp, je vais suivre ton conseil cependant t'aurais pas un exemple qui explique tout cela enfin a part ceux de sun parceque pour moi ils ne sont pas complet et aussi qui met a jour les valeurs quand je saisie des valeurs dans le tableau, une autre question : j'aimerai bien rendre toute les lignes ajoutés editable (puisque celle qui sont initialiser avec la table ne le sont pas)
    et puis un exemple vaut mieux que tout autre chose merci.
    J'ai du mal avec la notion modele et vue merci de ton aide.

  7. #7
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    regarde ce tuto, il pourra te permettre de comprendre le fonctionnement de la JTable qui est un peu complexe pour un débutant !

    Edit: voici un lien JTable plus complet.
    télécharge le PDF sur : Compléments GUI (JTable,...)

    bonne lecture !

  8. #8
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut Reprenons à zéro
    merci pour le tuto,
    non ce que je veux c'est supprimer la ligne selectionner et non pas la derniere et ajouter à getSelectedRow + 1 (sauf le cas du tri) et mon probleme c'est avec le tri que je fais avec table.setAutoCreateRowSorter(true) du coup table.getSlectedRow() ne correspond pas à ce que j'ai sur la vue.
    mais vous savez j'ai jamais fait du swing et depuis que je me suis mis sur la JTable j'ai fait tout le tour des tuto meme celui que vous m'avez donné.
    le plus simple c'est de rexposer ce que je veux faire.
    jj'ai une frame vide un jfilechoser se lance puis je slectionne un fichier csv
    je met les titre dans un tab[] et les data dans un tab2[] apres j'init ma table voici la fonction :

    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
     
    private void initMyTable() {
    		JScrollPane scrollPane;
    		jPanel = new JPanel();
    		jPanel.setLayout(new BorderLayout());
    		getContentPane().add(jPanel);
    		ColumnNames = t.tabToTab1();
    		cellData = t.tabToTab2();
    		// Create a table with initial data
    		Vector<Object> rowData = new Vector<Object>();
    		initDataInTab(rowData, cellData);
    		Vector<String> columnNamesV = new Vector<String>(Arrays
    				.asList(ColumnNames));
     
    		table = new JTable();
    		table.setModel(model);
    		model.setDataVector(rowData, columnNamesV);
    		table.setAutoCreateRowSorter(true);
    		table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    		scrollPane = new JScrollPane(table);
    		jPanel.setOpaque(true);
    		jPanel.add(scrollPane, BorderLayout.CENTER);
    		setVisible(true);
    		// on applique le renderer sur tous les headers de la table
    		TableCellRenderer headerRenderer = table.getTableHeader()
    				.getDefaultRenderer();
    		((DefaultTableCellRenderer) headerRenderer)
    				.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
    		// On veut pas de ligne bleue
    		table.setRowSelectionAllowed(false);
    		/* set default editor for Objects */
    		table.setDefaultEditor(Object.class, new MyDefaultCellEditor(
    				new JTextField()));
    		table.setDefaultRenderer(Object.class, new MyRenderer());
    		// Add the action to the component
    		table.addKeyListener(this);
    		table.getComponentListeners();
    		// pour eviter toute surprise on fixe les colonnes (ancrage des col)
    		table.getTableHeader().setReorderingAllowed(false);
    		table.addMouseListener(this);
    		initPopupMenu(); // le menu click droit
    }
    /* transforme le tableau cellData en un tableau de vecteur -d'objet rowData- */
    	private void initDataInTab(Vector<Object> rowData, Object[][] cellData) {
    		for (int i = 0; i < cellData.length; i++) {
    			Vector<Object> colData = new Vector<Object>(Arrays
    					.asList(cellData[i]));
    			rowData.add(colData);
    		}
     
    	}
    	private void ajouter() {
    		int indice = table.getRowSorter().convertRowIndexToModel(table.getRowCount());
    		if (indice == 0)
    			model.insertRow(0, emptyRow());
    		else if (indice != 0 && indice != -1) {
    			/*
    			 * ici mettre la oula souris à cliquer getSelectedRow par rapport au
    			 * model et non pas la table !
    			 */
    			model.insertRow(indice+1, copyRowAt(table
    					.getSelectedRow()));
    		} else {
    			JOptionPane.showMessageDialog(this, bundle.getString("FSelect"),
    					bundle.getString("Warning"),
    					JOptionPane.INFORMATION_MESSAGE);
    		}
    		model.fireTableStructureChanged();
    		model.fireTableDataChanged();
    		printDebugData();
    	}
    private void supprimer() {
    		if (model.getRowCount() != 0 && table.getSelectedRow() != -1) {
    			/*
    			 * ici mettre la oula souris à cliquer getSelectedRow par rapport au
    			 * model et non pas la table !
    			 */
    			model.removeRow(table.getSelectedRow());
    		} else {
    			if (table.getRowCount() == 0)
    				JOptionPane.showMessageDialog(this, "La table est vide", bundle
    						.getString("Warning"), JOptionPane.INFORMATION_MESSAGE);
    			else
    				JOptionPane.showMessageDialog(this,
    						bundle.getString("FSelect"), bundle
    								.getString("Warning"),
    						JOptionPane.INFORMATION_MESSAGE);
    		}
    		model.fireTableStructureChanged();
    		model.fireTableDataChanged();
    		printDebugData();
    	}
    voici comment je procede, je sais le code que je fais de la merde mais si t'as des remarques n'hesites pas a me les signaler
    c'st tres gentil de ta part
    bonne soiree

  9. #9
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut
    ça serait pas mieux si je definie un model ?
    et je vous le cache pas j'ai vraiment un probleme pour mettre en relation le modele et la jtable.

  10. #10
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut Derniere nouvelle
    Bon je cede parceque la sans cours sans rien je vais pas m'en sortir meme si je lis tout les tuto du monde.
    voici ce que je fais et franchement je crois que je suis aller juska mon max et la j fais appel à l'experience je vois pas du tout pourquoi ça marche pas :
    1- Il me pete une java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 2 at java.util.Vector.get(Unknown Source) at MyTableModel.getValueAt(MyTableModel.java:247)
    quand je veux ajouter une ligne et ça arrive quand je supp toute les valeur initialement presente dans la table.
    2- Quand j'actionne le tri la c'est le BORDEL total il me supprime pas les valeurs selectionné sur la vue mais plutot celle du model, comment résoudre mon souci sachant que vous avez mes deux versions .
    voici la seconde et je pense pas que je peux faire une 3eme lol
    ps : sur la premiere j'utilise le modele par defaut et dans la seconde l'abstract.
    JE FAIS APPEL L'EXPERIENCE dites moi SVP ou est ce que ça merde !
    classe modele:
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
     
     
    import java.util.Vector;
     
    import javax.swing.event.TableModelEvent;
    import javax.swing.table.AbstractTableModel;
     
    public class MyTableModel extends AbstractTableModel {
    	private static final long serialVersionUID = 1L;
    	protected Vector dataVector;
    	protected Vector columnIdentifiers;
     
    	public MyTableModel(Vector data, Vector columnNames) {
    		setDataVector(data, columnNames);
    	} // DefaultTableModel()
     
    	public MyTableModel(Object[][] data, String[] columnNames) {
    		this(convertToVector(data), convertToVector(columnNames));
    	} // DefaultTableModel()
     
    	/**
             * getDataVector
             */
    	public Vector getDataVector() {
    		return dataVector;
    	} // getDataVector()
     
    	/**
             * setDataVector
             */
    	public void setDataVector(Vector data, Vector columnNames) {
     
    		// Variables
    		int rowIndex;
    		int numRows;
    		int numColumns;
    		Vector columnVector;
     
    		// Set Data
    		dataVector = data;
    		columnIdentifiers = columnNames;
     
    		// Check Data
    		numRows = data.size();
    		numColumns = columnNames.size();
    		for (rowIndex = 0; rowIndex < numRows; rowIndex++) {
    			columnVector = (Vector) dataVector.get(rowIndex);
    			columnVector.setSize(numColumns);
    		} // for
     
    	} // setDataVector()
     
    	/**
             * setDataVector
             */
    	public void setDataVector(Object[][] data, Object[] columnNames) {
    		setDataVector(convertToVector(data), convertToVector(columnNames));
    	} // setDataVector()
     
    	/**
             * newDataAvailable TODO
             */
    	public void newDataAvailable(TableModelEvent event) {
    		fireTableChanged(event);
    	} // newDataAvailable()
     
    	/**
             * newRowsAdded
             */
    	public void newRowsAdded(TableModelEvent event) {
    		fireTableChanged(event);
    	} // newRowsAdded()
     
    	/**
             * rowsRemoved
             */
    	public void rowsRemoved(TableModelEvent event) {
    		fireTableChanged(event);
    	} // rowsRemoved()
     
    	/**
             * setColumnIdentifiers
             */
    	public void setColumnIdentifiers(Vector columnIdentifiers) {
    		this.columnIdentifiers = columnIdentifiers;
    		setColumnCount(columnIdentifiers.size());
    	} // setColumnIdentifiers()
     
    	/**
             * setColumnIdentifiers
             */
    	public void setColumnIdentifiers(Object[] columnIdentifiers) {
    		setColumnIdentifiers(convertToVector(columnIdentifiers));
    	} // setColumnIdentifiers()
     
    	/**
             * setNumRows
             */
    	public void setNumRows(int numRows) {
    		setRowCount(numRows);
    	} // setNumRows()
     
    	/**
             * setRowCount
             */
    	public void setRowCount(int rowCount) {
    	} // setRowCount()
     
    	/**
             * setColumnCount
             */
    	public void setColumnCount(int columnCount) {
    	} // setColumnCount()
     
    	/**
             * addColumn
             */
    	public void addColumn(Object columnName) {
    		addColumn(columnName, new Vector(dataVector.size()));
    	} // addColumn()
     
    	/**
             * addColumn
             */
    	public void addColumn(Object columnName, Vector columnData) {
    		// TODO
    	} // addColumn()
     
    	/**
             * addColumn
             */
    	public void addColumn(Object columnName, Object[] columnData) {
    		// TODO
    	} // addColumn()
     
    	/**
             * addRow
             */
    	public void addRow(Vector rowData) {
    	} // addRow()
     
    	/**
             * addRow
             * 
             * @param value0
             *            TODO
             */
    	public void addRow(Object[] rowData) {
    		addRow(convertToVector(rowData));
    		fireTableStructureChanged();
    	} // addRow()
     
    	/**
             * insertRow
             */
    	public void insertRow(int row, Vector rowData) {
    		dataVector.add(row, rowData);
    		fireTableStructureChanged();
    	} // insertRow()
     
    	/**
             * insertRow
             */
    	public void insertRow(int row, Object[] rowData) {
    		insertRow(row, convertToVector(rowData));
    		fireTableStructureChanged();
    	} // insertRow()
     
    	/**
             * moveRow
             */
    	public void moveRow(int startIndex, int endIndex, int toIndex) {
     
    		// Variables
    		int index;
    		Vector vector;
     
    		// Move Rows
    		for (index = 0; index < (endIndex - startIndex); index++) {
    			vector = (Vector) dataVector.remove(startIndex);
    			dataVector.add(toIndex, vector);
    		} // for
    		fireTableStructureChanged();
    	} // moveRow()
     
    	/**
             * removeRow
             */
    	public void removeRow(int row) {
    		dataVector.remove(row);
    		fireTableStructureChanged();
    	} // removeRow()
     
    	/**
             * getRowCount
             */
    	public int getRowCount() {
    		return dataVector.size();
    	} // getRowCount()
     
    	/**
             * getColumnCount
             */
    	public int getColumnCount() {
    		return columnIdentifiers.size();
    	} // getColumnCount()
     
    	/**
             * getColumnName
             * 
             * @returns String
             */
    	public String getColumnName(int column) {
     
    		// Check for Column
    		if (columnIdentifiers == null || column >= getColumnCount()) {
    			return super.getColumnName(column);
    		} // if
     
    		// Return Column name
    		return (String) columnIdentifiers.get(column);
     
    	} // getColumnName()
     
    	/**
             * isCellEditable
             * 
             * @returns boolean
             */
    	public boolean isCellEditable(int row, int column) {
    		return true;
    	} // isCellEditable()
     
    	/**
             * getValueAt
             * 
             * @returns Object
             */
    	public Object getValueAt(int row, int column) {
     
    		// Variables
    		Vector rowVector;
     
    		// Get Row Vector
    		rowVector = (Vector) dataVector.get(row);
     
    		// Get Data
    		return rowVector.get(column);
     
    	} // getValueAt()
     
    	/**
             * setValueAt
             */
    	public void setValueAt(Object value, int row, int column) {
     
    		// Variables
    		Vector rowVector;
     
    		// Get Row Vector
    		rowVector = (Vector) dataVector.get(row);
     
    		// Set Data
    		rowVector.remove(column);
    		rowVector.add(column, value);
     
    	} // setValueAt()
     
    	/**
             * convertToVector
             * 
             * @returns Vector
             */
    	protected static Vector<String> convertToVector(Object[] objects) {
     
    		// Variables
    		int index;
    		Vector<String> vector;
     
    		// Check for null
    		if (objects == null) {
    			return null;
    		} // if
     
    		// Process
    		vector = new Vector<String>();
    		for (index = 0; index < objects.length; index++) {
    			vector.add((String) objects[index]);
    		} // for: index
     
    		// Return new Vector
    		return vector;
     
    	} // convertToVector()
     
    	/**
             * convertToVector
             * 
             * @returns Vector
             */
    	protected static Vector<Vector<String>> convertToVector(Object[][] data) {
     
    		// Variables
    		int index;
    		Vector<Vector<String>> vector;
     
    		// Process
    		vector = new Vector<Vector<String>>();
    		for (index = 0; index < data.length; index++) {
    			vector.add(convertToVector(data[index]));
    		} // for: index
     
    		// Return new Vector
    		return vector;
     
    	} // convertToVector()
     
    } // DefaultTableModel
    classe Main :
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.util.Vector;
     
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
     
    public class WindowTest extends javax.swing.JFrame {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private JScrollPane jscrollp;
    	private JTable table;
    	private JPanel jp;
    	/*
    	 * public boolean isCellEditable(int row, int col) { // OK pour abstract /*
    	 * fireTableCellUpdated(row, col); fireTableDataChanged();
    	 *//*
    		 * for (int i = 0; i < id.length; i++) { if (row == id[i]) return (col <
    		 * (table.getColumnCount() - 1)) ? false : true; } return true; }
    		 *  };
    		 */
    	Object[][] cellData = { { "1-1", "1-2", "1-3", "1-4", "1-5", "1-6" },
    			{ "2-1", "1-2", "1-3", "1-4", "1-5", "1-6" },
    			{ "3-1", "1-2", "1-3", "1-4", "1-5", "1-6" } };
    	String[] columnNames = { "col1", "col2", "col3", "col4", "col5", "col6" };
    	MyTableModel model = new MyTableModel(cellData, columnNames);
     
    	public WindowTest() {
    		super("Table");
    		// Create a table with initial data
    		table = new JTable(model);
    		table.setAutoCreateRowSorter(true);
    		jscrollp = new JScrollPane(table);
    		jp = new JPanel();
    		// Create an action
    		Action actionAdd = new AbstractAction("addCopy") {
    			private static final long serialVersionUID = 1L;
     
    			// This method is called when the button is pressed
    			public void actionPerformed(ActionEvent evt) {
     
    				if (model.getRowCount() > 0 && table.getSelectedRow() != -1) {
    					/* Pour ajouter une copy ligne avec des données connus */
    					/*
    					 * ici mettre la ou la souris à cliquer getSelectedRow par
    					 * rapport au model et non pas la table !
    					 */
    					model.insertRow(table.getSelectedRow() + 1, copyRowAt(table
    							.getSelectedRow()));
    				} else {
    					System.out.println("plus de l ds t ou pas de l selec");
    				}
    				printDebugData(table);
    			}
    		};
    		Action actionDel = new AbstractAction("Del") {
    			private static final long serialVersionUID = 1L;
     
    			// This method is called when the button is pressed
    			public void actionPerformed(ActionEvent evt) {
    				if (model.getRowCount() != 0 && table.getSelectedRow() != -1) {
    					/*
    					 * ici mettre la oula souris à cliquer getSelectedRow par
    					 * rapport au model et non pas la table !
    					 */
    					model.removeRow(table.getSelectedRow());
    				} else {
    					System.out.println("plus de l ds t ou pas de l selec");
    				}
    				printDebugData(table);
    			}
    		};
    		Action actionEmp = new AbstractAction("Emp") {
    			private static final long serialVersionUID = 1L;
     
    			// This method is called when the button is pressed
    			public void actionPerformed(ActionEvent evt) {
    				System.out.println("RowCountModel : " + model.getRowCount());
    				if (model.getRowCount() > 0)
    					model.insertRow(model.getRowCount(), emptyRow());
    				else
    					model.addRow(new Vector<Object>());
    				printDebugData(table);
    			}
    		};
    		// Create the button
    		JButton buttonAdd = new JButton(actionAdd);
    		JButton buttonDel = new JButton(actionDel);
    		JButton buttonEmp = new JButton(actionEmp);
    		jp.add(buttonAdd);
    		jp.add(buttonDel);
    		jp.add(buttonEmp);
    		jp.setOpaque(true);
    		jp.add(jscrollp, BorderLayout.CENTER);
    		getContentPane().add(jp);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setVisible(true);
    		setBounds(100, 100, 500, 300);
    	}
     
    	private Vector<Object> copyRowAt(int row) {
    		Vector<Object> copy = new Vector<Object>();
    		for (int i = 0; i < table.getColumnCount(); i++)
    			copy.add(table.getValueAt(row, i) + " c");
    		return copy;
    	}
     
    	private Vector<Object> emptyRow() {
    		Vector<Object> ligneVide = new Vector<Object>();
    		for (int i = 0; i < table.getRowCount(); i++) {
    			if (i == 0)
    				ligneVide.add("ID");
    			ligneVide.add("");
    		}
    		return ligneVide;
    	}
     
    	private void printDebugData(JTable table) {
    		int numRows = model.getRowCount();
    		int numCols = model.getColumnCount();
     
    		System.out.println("Value of data for : " + model.getRowCount());
    		for (int i = 0; i < numRows; i++) {
    			System.out.print("    row " + i + ":");
    			for (int j = 0; j < numCols; j++) {
    				System.out.print("  " + model.getValueAt(i, j));
    			}
    			System.out.println();
    		}
    		System.out.println("--------------------------");
    	}
     
    	/**
             * Auto-generated main method to display this JFrame
             */
    	public static void main(String[] args) {
    		WindowTest inst = new WindowTest();
    		inst.setVisible(true);
    	}
     
    }
    et je vous rappel ce que je veux faire :
    - ajouter une ligne à endroit precis avec ou sans tri
    - suprimer une ligne precise avec ou sans tri
    je sais si default ou l'abstract modele qui convient à cette situation et aussi je sais s'il faut utiliser TableSorter ???

    Merci et bonne nuit !

  11. #11
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    ton code me parait un peu brouillon,

    voilà comment je fais moi:
    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
    /*
     * TableModele.java
     *
     * Created on 27 mai 2007, 18:06
     *
     * To change this template, choose Tools | Template Manager
     * and open the template in the editor.
     */
     
    package Presentation.Etudiant.Modeles;
     
    import Metier.Etudiant.Etudiant;
    import Metier.Types.Var;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    import javax.swing.table.AbstractTableModel;
     
    /**
     *
     * @author bassim
     */
    public class ModeleEtudiants extends AbstractTableModel {
     
        private List<Etudiant> etudiantsModele;
     
        /** Creates a new instance of TableModele */
        public ModeleEtudiants(Collection<Etudiant> etudiants) {
            // construction d'une ArrayList pour le modèle
            this.etudiantsModele = new ArrayList<Etudiant>(etudiants);
            this.fireTableDataChanged();
        }
     
        public int getColumnCount() {
            return 5;
        }
     
     
        public String getColumnName(int column) {
            switch (column){
                case 0:return "Nom / Prénom";
                case 1:return "Age";
                case 2:return "Année d'inscription";
                case 3:return "Nationalité";
                case 4:return "Promotion actuelle";
            }
            return "";
        }
     
        public int getRowCount() {
            if (etudiantsModele==null) return 0;
            else return etudiantsModele.size();
        }
     
        public Object getValueAt(int row, int column) {
            switch (column){
     
                case 0: String nom = getEtudiant(row).getNom();
                        String[] listPrenoms = etudiantsModele.get(row).getPrenom();
                        String prenoms = "" ;
                        for (String prenom:listPrenoms)  
                            if (prenom != null ) prenoms = prenoms + prenom +" ";
                        return nom +", "+prenoms;
     
                case 1: return Var.age(
                         getEtudiant(row).getEtatCivil().getDate_naissance());
     
                case 2: return etudiantsModele.get(row).getAnnee();
     
                case 3: return Var.NATIONALITES[
                         getEtudiant(row).getEtatCivil().getNationalite()
                         ];
     
                case 4: if (getEtudiant(row).getCursus().getPromoActuelle() == null) 
                            return "";
                        else 
                            return getEtudiant(row).getCursus().getPromoActuelle().getIntitule();
            }
             return "";
        }
     
        public Etudiant getEtudiant(int row) {
            return etudiantsModele.get(row);
        }
     
        public void ajouterEtudiant(Etudiant etud) {
            if (etud == null)  return ;
     
            etudiantsModele.add(etud);
            this.fireTableDataChanged();
     
        }
     
        public void enleverEtudiant(Etudiant etud) {
            if (etud == null) return ;
     
            etudiantsModele.remove(etud);
            this.fireTableDataChanged();
     
     
        }
     
     
    }
    Je crois que tu devrais essayer avec un exemple simple, et ensuite monter en difficulté progressivement

  12. #12
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par bassim Voir le message
    Je crois que tu devrais essayer avec un exemple simple, et ensuite monter en difficulté progressivement
    Justement la je suis sur un projet d'univ la je suis sorti du projet pour faire ça donc je crois que j'ai commencé par le plus simple parceque c'est vrai au depart je regardais pas le chemin mais la ou je veux arriver alors que le chemlin pour y arriver est plein d'obstacle..bref la je suis parti sur un truc simple j rempli à la main ma table jai fait un modele et je veux juste en fait gerer le moment ou j'active le tri tu vois.
    c'est a dire que l'info que je recupere avec getSelected est fausse puisque tout a changé d'ordre .
    et merci pour ton bout de code mais malheuresement ça m'arrange pas et aussi il est un peu compliqué t'utilise des tab associatif et moi et les hashtab ça fait deux lol ça fait qu'une 15 de jours que je suis sur java lol donc pas de truc hard.
    merci pour ton aide.
    et si tas une idee pour le tri je suis preneur, le conflit de getSelectedRow.
    merci

  13. #13
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut
    Merci beaucoup Bassim, c'est tres gentil de ta part EFFECTIVEMENT c'est ça ce qu'il faut utiliser modelRow = table.convertRowIndexToModel(viewRow); mdrr aprés un bon café j'ai pris le temps de lire attentivement le tuto et honte à moi qui veut aller vite mdrr je lis les tuto comme si je lisais un journal lol
    Merci et un autre probleme RESOLU!

  14. #14
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (model.getRowCount() > 0 && table.getSelectedRow() != -1) {
    					/* Pour ajouter une copy ligne avec des données connus */
    					/*
    					 * ici mettre la ou la souris à cliquer getSelectedRow par
    					 * rapport au model et non pas la table !
    					 */
    					model.insertRow(table.getSelectedRow() + 1, copyRowAt(table
    							.getSelectedRow()));
    				} else {
    					System.out.println("plus de l ds t ou pas de l selec");
    				}
    				printDebugData(table);
    			}
    peut être que tu devrais changer ça :
    en ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ligneSel = table.convertIndexToModel(table.getSelectedRow());
    et travailler avec ligneSel plutot que le getSelectedRow()

    à vrai dire, j'ai du mal à comprendre ton probleme

  15. #15
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Citation Envoyé par AliJava Voir le message
    Merci beaucoup Bassim, c'est tres gentil de ta part EFFECTIVEMENT c'est ça ce qu'il faut utiliser modelRow = table.convertRowIndexToModel(viewRow); mdrr aprés un bon café j'ai pris le temps de lire attentivement le tuto et honte à moi qui veut aller vite mdrr je lis les tuto comme si je lisais un journal lol
    Merci et un autre probleme RESOLU!
    j'avais pas vu que t'avais trouvé le problème !

    Edit: en plus je t'avais lancé dans la bonne direction dans un message précédent

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

Discussions similaires

  1. [JTable] Actualisation après ajout et suppression
    Par amola1992 dans le forum Composants
    Réponses: 6
    Dernier message: 29/07/2014, 00h36
  2. Réponses: 3
    Dernier message: 02/05/2007, 11h39
  3. Mandriva refuse de demarrer apres l ajout d un nouveau dd
    Par Cazaux-Moutou-Philippe dans le forum Administration système
    Réponses: 6
    Dernier message: 24/03/2006, 11h57
  4. Réponses: 2
    Dernier message: 02/06/2005, 11h21
  5. [JTable] Simuler clic gauche après clic droit
    Par Oliveuh dans le forum Composants
    Réponses: 1
    Dernier message: 03/12/2004, 13h35

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