Bonjour,

J'ai une JTable, dont je souhaiterai rafraichir les données.

J'ai donc tout bonnement fait

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);
qui fonctionne mais qui réinitialise mon sorter, logique j'en remets un.

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 :

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]);
		}
Je retire toutes les lignes et j'ajoute mes nouvelles lignes. Le truc, c'est que ça me lève des exceptions :

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)
Exceptions qui ne viennent pas de mon code mais de celui de DefaultTableModel.

Je précise que MyTableModel est un DefaultTableModel classique :

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;
 
    }
}
Alors, y-a-t-il une solution plus simple et/ou qui fonctionne ?

Merci d'avance

F.