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 :

[JTable][Model] Rafraichir le modèle sans reset le sorter


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut [JTable][Model] Rafraichir le modèle sans reset le sorter
    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.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Il ne faut pas réaffecter un nouveau model, il faut simplement le mettre à jour.

    Dans mon modèle, j'ai une méthode de mise à jour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void setData(List<Processus> data) {
     this.dataModel = data;
     fireTableDataChanged();
    }

Discussions similaires

  1. [JTable]Affichage avec un modèle dynamique impossible
    Par leminipouce dans le forum Composants
    Réponses: 4
    Dernier message: 07/02/2006, 20h42
  2. [JTABLE][MODEL][RENDERER]Communication
    Par cameleon2002 dans le forum Composants
    Réponses: 1
    Dernier message: 31/12/2005, 15h36
  3. [Rafraichir] Rafraichir une page sans perdre mes champs
    Par ozzmax dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/11/2005, 18h54
  4. [JTable] Problème avec le modèle
    Par etiennegaloup dans le forum Composants
    Réponses: 2
    Dernier message: 20/09/2005, 17h25
  5. [J2ME][MIDlet]rafraichir une image sans toucher au form?
    Par noobiewan kenobi dans le forum Java ME
    Réponses: 1
    Dernier message: 05/09/2005, 10h54

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