Bonjour,
J'ai un problème avec mon JTable. J'utilise une classe toute simple de données (3 attributs et les accesseurs qui vont avec) pour remplir mon JTable. Pour stocker les données de mon tableau j'utilise une liste d'objet de ma classe de données.
Or, dès que je lance mon application l'affichage plante. Voici le code de ma partie view :
Je vous exempt du setVisible & co.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // create the JTable String[] title = {"Name", "Type", "Type_ID"}; SlowControlRow[] dataTable = { new SlowControlRow("", "", 0) }; this.table = new JTable(new TableModelObject(title, dataTable)); // set 3 first columns behavior this.table.getColumn("Name").setCellEditor(new DefaultCellEditor(new JTextField())); this.table.getColumn("Type").setCellEditor(new DefaultCellEditor(new JTextField())); this.table.getColumn("Type_ID").setCellEditor(new DefaultCellEditor(new JTextField()));
Ensuite, lors du chargement de mon tableau celui-ci fait appel à la méthode getValueAt (normal me direz vous !). Cependant, il y fait appel deux fois en incrémentant l'index de la ligne. Voici l'erreur avec un affichage de l'index de ligne et de colonne dans getValueAt :
Je ne comprends pas pourquoi il essaye d'accéder à la deuxième ligne de la liste alors que dans la variable data que je passe au constructeur de mon modèle, il n'y a qu'une seule ligne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 col : 0 row : 0 col : 0 row : 1 Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at bookeeping.control.table.TableModelObject.getValueAt(TableModelObject.java:79) at javax.swing.JTable.getValueAt(JTable.java:2686) [...]
J'ai fais des tests de mesure de la longueur de ma liste, le résultat est toujours 1.
En prime, voici le code de ma classe TableModelObject :
getValueAt étant appelé à chaque rafraichissement du tableau, il ne devrait chercher que la ligne 0 de ma liste et pas essayer d'aller au delà non ? Vu que ma List data ne contient qu'un seul objet ( par conséquent qu'une seule ligne).
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 public class TableModelObject extends AbstractTableModel { private List<SlowControlRow> data = new ArrayList<SlowControlRow>(); private final String[] title; /** * Constructs an table object model with title and data. * @param title * The array containing all titles. * @param data * An array of SlowControlRow. */ public TableModelObject(String[] title, SlowControlRow[] data) { this.title = title; for(SlowControlRow value : data) this.data.add(value); } /** * Returns the rows number. * @return * The rows number. */ public int getRowCount(){ return this.data.size(); } /** * Returns the columns number. * @return * The columns number. */ public int getColumnCount() { return this.title.length; } /** * Returns the column name corresponding to the column index. * @param col * Column index. * @return * Column name. */ @Override public String getColumnName(int col){ return this.title[col]; } /** * Returns the value corresponding to the column index and the row index. * @param col * The column index. * @param row * The row index. * @return * Tha value which matches. */ @Override public Object getValueAt(int col, int row) { System.out.println("col : "+col+" row : "+row); switch(col) { case 0 : return this.data.get(row).getName(); case 1 : return this.data.get(row).getType(); case 2 : return this.data.get(row).getType_id(); default : return null; } } /** * Inserts a row in the table. * @param newData * The row to be inserted. */ public void addRow(SlowControlRow newData) { this.data.add(newData); fireTableRowsInserted(this.data.size()-1, this.data.size()-1); } /** * Removes rows in the dataTable * @param row * The row to be deleted. */ public void removeRow(int row) { this.data.remove(row); fireTableRowsDeleted(row, row); } }
Si quelqu'un connait la cause du problèmeJ'ai googler mon problème mais je n'ai pas trouvé de réponses.
Cdlt,
Partager