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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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 confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    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 confirmé 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
    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 chevronné 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 : 40
    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
    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 chevronné 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 : 40
    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
    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 confirmé 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
    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 chevronné 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 : 40
    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
    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 !

+ 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