Bonjour,
J'ai une JTable, dont je souhaiterai rafraichir les données.
J'ai donc tout bonnement fait
qui fonctionne mais qui réinitialise mon sorter, logique j'en remets un.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Object[][] datas=getUpdatedPayementTermsData(); //table=new JTable(); model=new MyTableModel(datas, columnNames,MyTableModel.CONTACT_MODEL); table.setModel(model); //to sort rows sorter = new TableRowSorter<MyTableModel>(model); table.setRowSorter(sorter);
En retirant le setRowSorter(sorter), aucune différence. Je me dis donc que changer de modèle réinitialise automatiquement le sorter (ce qui n'est, à priori, pas annoncé dans la documentation).
Je me dis donc que je vais vider mon modèle actuel et mettre mes datas comme je veux, donc je fais ceci :
Je retire toutes les lignes et j'ajoute mes nouvelles lignes. Le truc, c'est que ça me lève des exceptions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Object[][] datas=getUpdatedContactsData(); //table=new JTable(); for(int i=0;i<table.getModel().getRowCount()-1;i++) { System.out.println(i + " et row count = " + table.getModel().getRowCount()); ((MyTableModel)(table.getModel())).removeRow(0); } for(int i=0;i<datas.length;i++) { ((MyTableModel)(table.getModel())).insertRow(0,datas[i]); }
Exceptions qui ne viennent pas de mon code mais de celui de DefaultTableModel.Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException:
-1
at java.util.Vector.elementAt(Vector.java:430)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java
:633)
at ManageContactsDialog$TableChangeListener.tableChanged(ManageContactsD
ialog.java:451)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableMo
del.java:280)
at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTab
leModel.java:245)
at javax.swing.table.DefaultTableModel.removeRow(DefaultTableModel.java:
447)
at ManageContactsDialog.updateTable(ManageContactsDialog.java:308)
Je précise que MyTableModel est un DefaultTableModel classique :
Alors, y-a-t-il une solution plus simple et/ou qui fonctionne ?
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 import javax.swing.table.*; public class MyTableModel extends DefaultTableModel { public final static int CLIENT_MODEL=1; public final static int PRODUCT_MODEL=CLIENT_MODEL+1; public final static int CONTACT_MODEL=PRODUCT_MODEL+1; public final static int CATEGORY_MODEL=CONTACT_MODEL+1; public final static int SALES_MODEL=CATEGORY_MODEL+1; public final static int PAYEMENTTERM_MODEL=SALES_MODEL+1; public final static int NO_MODIFICATION=PAYEMENTTERM_MODEL+1; public final static int REMINDER=NO_MODIFICATION+1; int model; MyTableModel(Object[][] datas, Object[] columnNames, int model) { super(datas, columnNames); this.model=model; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { switch(model) { case CLIENT_MODEL: if( columnIndex == 0) return false; return true; case CONTACT_MODEL: if(columnIndex == 0 || columnIndex == 2) return false; return true; case PRODUCT_MODEL: if(columnIndex == 0 || columnIndex == 3) return false; return true; case CATEGORY_MODEL: if(columnIndex==0) return false; return true; case SALES_MODEL: if(columnIndex==7) return true; return false; case PAYEMENTTERM_MODEL: if(columnIndex==0 || columnIndex == 4 || columnIndex == 1) return false; return true; case NO_MODIFICATION: return false; case REMINDER: if(columnIndex==6) return true; return false; } return true; } public Class getColumnClass(int c) { if(getRowCount()!=0) { if(model==REMINDER) if(c==5) { return javax.swing.JButton.class; } if(getValueAt(0,c)!=null) return getValueAt(0, c).getClass(); } return Object.class; } }
Merci d'avance
F.
Partager