Question bête : comment qu'on fait pour supprimer une ligne d'un JTable?...
Question bête : comment qu'on fait pour supprimer une ligne d'un JTable?...
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...
Et si au lieu d'un DefaultTableModel, je suis obligé d'utiliser ce modèle-ci :
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
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(); } }); } }
:
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); }
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()...
Code de la méthode removeRow(int i)
dataVector est un attribut de la classe DefaultTableModel.
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); }
Mais tu peux tres bien prendre DefaultTableModel plutot que AbstractTableModel puisque le premier hérite du deuxième.
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 :
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
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(); } }); } }
Je ne comprends pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public int getRowCount() { return tree.getRowCount(); }
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...
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...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager