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 :

problème avec le TableRowSorter


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Par défaut problème avec le TableRowSorter
    Bonjour

    j'essai de réaliser des tables triable, voici ke code que j'utilise :

    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
    tab = new JTable();
    			class mymodel extends AbstractTableModel{
    				private static final long serialVersionUID = 1L;
    				String[] colnames={"N°Officiel","N°Travail","Age Actuel","Date Rappel"};
    				public int getColumnCount() {
    					return 4;
    				}
    				public int getRowCount() {
    					return  bd.rappels_pesee.size();
    				}
     
    				public String getColumnName(int co){
    					return colnames[co];
    				}
    				public Object getValueAt(int ro, int co) {
    					if(co==0)
    						return bd.rappels_pesee.get(ro).fem.num_off;
    					else if(co==1)
    						return bd.rappels_pesee.get(ro).fem.getnum_trav();
    					else if(co==2)
    						return bd.rappels_pesee.get(ro).fem.getages();
    					else
    						return bd.rappels_pesee.get(ro).date_rappel;
     
    				}
     
    				public boolean isCellEditable(int ro,int co){
    					return false;
    				}
     
    				public void setValueAt(Object ob,int ro,int co){
    				}
     
    				public Class<?> getColumnClass(int colonne) {
    					return getValueAt(0,colonne).getClass();
    				}
    			}
    			tab.setDefaultRenderer(Object.class,new DefaultTableCellRenderer());
    			tab.setModel(new mymodel());
     
    			tab.setRowSorter(new TableRowSorter<TableModel>(tab.getModel()));
    Bien entendu tous les objets retournés par getValueAt() sont comparable, le code fonctionne parfaitement lorsque la table n'est pas vide (cad getRowCount()>0), mais le problème c'est que lorsque je vide la table et je clique sur une colonne du tableheader j'obtiens l'exception suivante: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

    y-a-t-il un moyen pour ce debarrasser de ce "bug" ??

    merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Par défaut
    je viens de trouver une solution, il suffisait de réecrire la fonction sort() du tablerowsorter de cette facon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tab.setRowSorter(new TableRowSorter<TableModel>(tab.getModel()){
    				public void sort(){
    					if(this.getModelRowCount()>0)
    						super.sort();
    				}
    			});

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Par défaut
    Re

    Je viens de me rendre compte que le rowsorter me cause encore un autre bug, en fait voici en détail ce qui se passe:

    j'ai une table qui a un rowsorter dans lequel j'ai redefinit la fonction sort() comme présenté dans mon post précédent, lorsque je clique sur une colonne pour trier, puis je clique sur un buton pour supprimer la dernière ligne du tableau j'obtiens

    Exception occurred during event dispatching:
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

    par contre si aucun tri n'est effectué sur le tableau (aucune des colonnes ne présente un fleche de tri), et je clique sur le bouton de suppression pour supprimer egalement la dernière ligne tout se passe bien.

    voici le actionListner du bouton de suppression:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    annul.addActionListener(new java.awt.event.ActionListener() {
    				public void actionPerformed(java.awt.event.ActionEvent e) {
    					int ind=tab.getSelectedRow() ;
    					if(ind>=0){
    						annuler_rappel();
    					}
    					System.out.println("!!");
    				}
    			});
    j'ai fait un affichage sur la console comme dernière instruction dans le actionPerformed(), et ce qui m'a étonné c'est que l'affichage du "!!" se fait avant l'enlenchement de l'exception, et là ca me semble très bizarre car ca prouve que l'enclenchement de l'exception se fait dans un endroit autre que le actionPerformed que je vois pas du tout.

    quelqu'un peut-il sauver ma vie !?

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Donne le code minimal qui compile permettant de reproduire le problème.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Par défaut
    voici un code minimale ayant exactement le même problème que mon code original:

    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.util.ArrayList;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableModel;
    import javax.swing.table.TableRowSorter;
     
     
    public class frame extends JFrame {
     
    	private static final long serialVersionUID = 1L;
    	private JPanel jContentPane = null;
    	private JScrollPane tab = null;
    	private JTable tabb = null;
    	private JButton suppr = null;
    	private ArrayList<Integer> ar=new ArrayList<Integer>();  //  @jve:decl-index=0:
     
    	/**
             * This method initializes tab  
             *      
             * @return javax.swing.JScrollPane      
             */
    	private JScrollPane getTab() {
    		if (tab == null) {
    			tab = new JScrollPane();
    			tab.setViewportView(getTabb());
    		}
    		return tab;
    	}
     
    	/**
             * This method initializes tabb 
             *      
             * @return javax.swing.JTable   
             */
    	private JTable getTabb() {
    		if (tabb == null) {
    			tabb = new JTable();
    			ar.add(new Integer(5));
    			ar.add(new Integer(6));
    			class mymodel extends AbstractTableModel{
    				private static final long serialVersionUID = 1L;
    				String[] colnames={"montant","monnaie"};
    				public int getColumnCount() {
    					return 2;
    				}
    				public int getRowCount() {
    					return  ar.size();
    				}
     
    				public String getColumnName(int co){
    					return colnames[co];
    				}
    				public Object getValueAt(int ro, int co) {
    					if(co==0)
    						return ar.get(ro);
    					else
    						return "Monnaie";
    				}
     
    				public boolean isCellEditable(int ro,int co){
    					return false;
    				}
     
    				public void setValueAt(Object ob,int ro,int co){
    				}
     
    				public Class<?> getColumnClass(int colonne) {
    					return getValueAt(0,colonne).getClass();
    				}
    			}
    			tabb.setDefaultRenderer(Object.class,new DefaultTableCellRenderer());
    			tabb.setModel(new mymodel());
     
    			tabb.setRowSorter(new TableRowSorter<TableModel>(tabb.getModel()){
    				public void sort(){
    					if(this.getModelRowCount()>0)
    						super.sort();
    				}
    			});
    		}
    		return tabb;
    	}
     
    	/**
             * This method initializes suppr        
             *      
             * @return javax.swing.JButton  
             */
    	private JButton getSuppr() {
    		if (suppr == null) {
    			suppr = new JButton();
    			suppr.setPreferredSize(new Dimension(34, 30));
    			suppr.setText("supprimer");
    			suppr.addActionListener(new java.awt.event.ActionListener() {
    				public void actionPerformed(java.awt.event.ActionEvent e) {
    					int ind=tabb.getSelectedRow() ;
    					if(ind>=0){
    						ind=tabb.getRowSorter().convertRowIndexToModel(ind);
    						ar.remove(ind);
    						((AbstractTableModel)(tabb.getModel())).fireTableDataChanged();
    					}
    				}
    			});
    		}
    		return suppr;
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				frame thisClass = new frame();
    				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    				thisClass.setVisible(true);
    			}
    		});
    	}
     
    	/**
             * This is the default constructor
             */
    	public frame() {
    		super();
    		initialize();
    	}
     
    	/**
             * This method initializes this
             * 
             * @return void
             */
    	private void initialize() {
    		this.setSize(324, 250);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setContentPane(getJContentPane());
    		this.setTitle("JFrame");
    		this.setVisible(true);
    	}
     
    	/**
             * This method initializes jContentPane
             * 
             * @return javax.swing.JPanel
             */
    	private JPanel getJContentPane() {
    		if (jContentPane == null) {
    			jContentPane = new JPanel();
    			jContentPane.setLayout(new BorderLayout());
    			jContentPane.add(getTab(), BorderLayout.CENTER);
    			jContentPane.add(getSuppr(), BorderLayout.NORTH);
    		}
    		return jContentPane;
    	}
     
    }  //  @jve:decl-index=0:visual-constraint="261,51"
    la première suppression se fait sans problème, la deuxième suppression bug seulement si une colonne est trié .

  6. #6
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Par défaut
    j'ai trouvé une solution pas très convaincante mais, ca illimne le bug au moins.

    il s'agit de remplacer le fireTableDataChanged() par fireTableStructureChanged().

    je suis toujours ouvert à toute autre proposition.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de gestion de Thread avec un TableRowSorter
    Par stef8383 dans le forum EDT/SwingWorker
    Réponses: 2
    Dernier message: 16/12/2013, 18h30
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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