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] Suppression d'une ligne


Sujet :

Composants Java

  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut [Debutant][JTable] Suppression d'une ligne
    Question bête : comment qu'on fait pour supprimer une ligne d'un JTable?...

  2. #2
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Points : 7 275
    Points
    7 275
    Par défaut
    Tu définis un javax.swing.table.DefaultTableModel (ou une classe héritante) comme modèle pour ta JTable (utilise le constructeur de la classe JTable, JTable(TableModel tm)...).
    Dans cette classe, certaines méthodes te seront très utile, dont la removeRow(int row);

    Edit: Petite correction...

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Et si au lieu d'un DefaultTableModel, je suis obligé d'utiliser ce modèle-ci :
    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
     
    public class TreeTableModelAdapter extends AbstractTableModel {
    	JTree tree;
     
    	TreeTableModel treeTableModel;
     
    	public TreeTableModelAdapter(TreeTableModel treeTableModel, JTree tree) {
    		this.tree = tree;
    		this.treeTableModel = treeTableModel;
     
    		tree.addTreeExpansionListener(new TreeExpansionListener() {
    			// Don't use fireTableRowsInserted() here; the selection model
    			// would get updated twice.
    			public void treeExpanded(TreeExpansionEvent event) {
    				fireTableDataChanged();
    			}
     
    			public void treeCollapsed(TreeExpansionEvent event) {
    				fireTableDataChanged();
    			}
    		});
    		tree.setLargeModel(true);
     
    		// Install a TreeModelListener that can update the table when
    		// tree changes. We use delayedFireTableDataChanged as we can
    		// not be guaranteed the tree will have finished processing
    		// the event before us.
    		treeTableModel.addTreeModelListener(new TreeModelListener() {
    			public void treeNodesChanged(TreeModelEvent e) {
    				delayedFireTableDataChanged();
    			}
     
    			public void treeNodesInserted(TreeModelEvent e) {
    				delayedFireTableDataChanged();
    			}
     
    			public void treeNodesRemoved(TreeModelEvent e) {
    				delayedFireTableDataChanged();
    			}
     
    			public void treeStructureChanged(TreeModelEvent e) {
    				delayedFireTableDataChanged();
    			}
    		});
    	}
     
    	// Wrappers, implementing TableModel interface.
     
    	public int getColumnCount() {
    		return treeTableModel.getColumnCount();
    	}
     
    	public String getColumnName(int column) {
    		return treeTableModel.getColumnName(column);
    	}
     
    	public Class getColumnClass(int column) {
    		return treeTableModel.getColumnClass(column);
    	}
     
    	public int getRowCount() {
    		return tree.getRowCount();
    	}
     
    	protected Object nodeForRow(int row) {
    		TreePath treePath = tree.getPathForRow(row);
    		return treePath.getLastPathComponent();
    	}
     
    	public Object getValueAt(int row, int column) {
    		return treeTableModel.getValueAt(nodeForRow(row), column);
    	}
     
    	public boolean isCellEditable(int row, int column) {
    		return treeTableModel.isCellEditable(nodeForRow(row), column);
    	}
     
    	public void setValueAt(Object value, int row, int column) {
    		treeTableModel.setValueAt(value, nodeForRow(row), column);
    	}
     
    	/**
             * Invokes fireTableDataChanged after all the pending events have been
             * processed. SwingUtilities.invokeLater is used to handle this.
             */
    	protected void delayedFireTableDataChanged() {
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				fireTableDataChanged();
    			}
    		});
    	}
    }
    avec TreeTableModel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    public interface TreeTableModel extends TreeModel {
    	/**
             * Returns the number ofs availible column.
             */
    	public int getColumnCount();
     
    	/**
             * Returns the name for column number <code>column</code>.
             */
    	public String getColumnName(int column);
     
    	/**
             * Returns the type for column number <code>column</code>.
             */
    	public Class getColumnClass(int column);
     
    	/**
             * Returns the value to be displayed for node <code>node</code>, at
             * column number <code>column</code>.
             */
    	public Object getValueAt(Object node, int column);
     
    	/**
             * Indicates whether the the value for node <code>node</code>, at column
             * number <code>column</code> is editable.
             */
    	public boolean isCellEditable(Object node, int column);
     
    	/**
             * Sets the value for node <code>node</code>, at column number
             * <code>column</code>.
             */
    	public void setValueAt(Object aValue, Object node, int column);
    }
    :

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Ou alors, est-ce que quelqu'un sait ce que fait la méthode removeRow() de la classe DefaultTableModel?

    Parce que je dois utiliser le modèle TreeTableModelAdapter et ma seule solution est de recoder la méthode removeRow()...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Code de la méthode removeRow(int i)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void removeRow(int row) {
            dataVector().removeElementAt(row);
            fireTableRowsDeleted(row, row);
        }
    dataVector est un attribut de la classe DefaultTableModel.
    Mais tu peux tres bien prendre DefaultTableModel plutot que AbstractTableModel puisque le premier hérite du deuxième.

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Ben j'ai essayé, mais j'ai un souci...

    En fait, je suis toujours avec mon problème de JTreeTable, mais je me suis dit que si je comprenais la marche à suivre avec un JTable, je pourrais la réutiliser pour mon JTreeTable.

    Or si au lieu de AbstractTableModel, j'utilise DefaultTableModel, j'ai un problème avec le JTree qui est déclaré dans ma classe TreeTableModelAdapter, qui est la suivante :

    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
     
    public class TreeTableModelAdapter extends AbstractTableModel {
    	JTree tree;
     
    	TreeTableModel treeTableModel;
     
    	public TreeTableModelAdapter(TreeTableModel treeTableModel, JTree tree) {
    		this.tree = tree;
    		this.treeTableModel = treeTableModel;
     
    		tree.addTreeExpansionListener(new TreeExpansionListener() {
    			// Don't use fireTableRowsInserted() here; the selection model
    			// would get updated twice.
    			public void treeExpanded(TreeExpansionEvent event) {
    				fireTableDataChanged();
    			}
     
    			public void treeCollapsed(TreeExpansionEvent event) {
    				fireTableDataChanged();
    			}
    		});
    		tree.setLargeModel(true);
     
    		// Install a TreeModelListener that can update the table when
    		// tree changes. We use delayedFireTableDataChanged as we can
    		// not be guaranteed the tree will have finished processing
    		// the event before us.
    		treeTableModel.addTreeModelListener(new TreeModelListener() {
    			public void treeNodesChanged(TreeModelEvent e) {
    				delayedFireTableDataChanged();
    			}
     
    			public void treeNodesInserted(TreeModelEvent e) {
    				delayedFireTableDataChanged();
    			}
     
    			public void treeNodesRemoved(TreeModelEvent e) {
    				delayedFireTableDataChanged();
    			}
     
    			public void treeStructureChanged(TreeModelEvent e) {
    				delayedFireTableDataChanged();
    			}
    		});
    	}
     
    	// Wrappers, implementing TableModel interface.
     
    	public int getColumnCount() {
    		return treeTableModel.getColumnCount();
    	}
     
    	public String getColumnName(int column) {
    		return treeTableModel.getColumnName(column);
    	}
     
    	public Class getColumnClass(int column) {
    		return treeTableModel.getColumnClass(column);
    	}
     
    	public int getRowCount() {
    		return tree.getRowCount();
    	}
     
    	protected Object nodeForRow(int row) {
    		TreePath treePath = tree.getPathForRow(row);
    		return treePath.getLastPathComponent();
    	}
     
    	public Object getValueAt(int row, int column) {
    		return treeTableModel.getValueAt(nodeForRow(row), column);
    	}
     
    	public boolean isCellEditable(int row, int column) {
    		return treeTableModel.isCellEditable(nodeForRow(row), column);
    	}
     
    	public void setValueAt(Object value, int row, int column) {
    		treeTableModel.setValueAt(value, nodeForRow(row), column);
    	}
     
    	/**
             * Invokes fireTableDataChanged after all the pending events have been
             * processed. SwingUtilities.invokeLater is used to handle this.
             */
    	protected void delayedFireTableDataChanged() {
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				fireTableDataChanged();
    			}
    		});
    	}
    }
    Mon prog me met une java.lang.NullPointerException lors de la création de ma table, et plus précisément sur cette fonction-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public int getRowCount() {
    	return tree.getRowCount();
    }
    Je ne comprends pas...

  7. #7
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Si je crée une classe qui hérite de DefaultTableModel, quelles méthodes dois-je redéfinir?

    Pour l'instant, quand je fais ça, mon prog plante lors de la création de l'objet de ma classe TreeTableModelAdapter qui hérite de DefaultTableModel...
    Et je ne comprends pas du tout, mais alors pas du tout, pourquoi!
    Pourquoi est-ce que ça passerai en AbstractTableModel et pas en DefaultTableModel?
    On n'a pas le droit de dériver la classe DefaultTableModel ou quoi???

    Je suis perdu, mais alors complètement...

  8. #8
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Je crois que je commence à comprendre, mais c'est pas gagné...

    Je ne peux pas utiliser de DefaultTableModel parce que cette classe stocke les données dans un vecteur de vecteurs.
    Or, ma classe TreeTableModelAdapter ne stocke pas vraiment les données, mais un JTree et un TreeTableModel qui étend TreeModel.

    Mes données à moi sont stockées dans un autre modèle qui se nomme DefectTableModel qui étend AbstractTreeTableModel qui lui-même implémente treeTableModel...

    C'est vraiment trop le merdier ces JTreeTable, je crois que je vais avoir du mal à m'en tirer...

Discussions similaires

  1. [JTable] suppression d'une ligne dans un JTable?
    Par hby dans le forum Composants
    Réponses: 14
    Dernier message: 15/03/2007, 15h44
  2. [JTABLE] suppression d'une ligne (prise de tete)
    Par uraxyd dans le forum Composants
    Réponses: 1
    Dernier message: 14/12/2005, 20h19
  3. [debutant] [JTable] ajout d'une ligne
    Par lanfeustdetroll dans le forum Composants
    Réponses: 1
    Dernier message: 29/06/2005, 19h19
  4. [JTable] problème après suppression d'une ligne
    Par fredo3500 dans le forum Composants
    Réponses: 7
    Dernier message: 17/03/2005, 11h01

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