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 :

un ArrayList implémentant TableModel ne marche pas


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut un ArrayList implémentant TableModel ne marche pas
    salut,

    je me pose une question existentielle:

    le but est pour moi d'afficher une JTable contenant des rendez-vous.
    un RDV est géré par la classe RDV (nom de la personne,prénom,id du RDV,etc...).

    j'ai créé une classe qui gère une liste de RDV, liste_RDV:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Liste_rdv extends ArrayList<RDV> implements TableModel {
    cette liste : est une collection (méthodes add, remove ...bien pratiques), et aussi un modèle pour la JTable; à cet effet les méthodes de l'interface TableModel ont été écrites dans Liste_rdv.

    mais lorsque je tente d'exécuter ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ArrayList<RDV> al = new ArrayList<RDV>();
                        JTable table = new JTable((TableModel) al);
                        JScrollPane scrollPane = new JScrollPane(table);
                        scrollPane.setBounds(10, 144, 819, 178);
                        f.frame.getContentPane().add(scrollPane);
    j'ai une erreur à la liste du new JTable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.ClassCastException: java.util.ArrayList cannot be cast to javax.swing.table.TableModel
    alors ça sert à quoi de définir une interface pour la JTable si on ne peut pas s'en servir?

    merci,

    olivier

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    A moins que je dise une bêtise, tu donnes une ArrayList a ta fonction (qui n'implemente donc pas TableModel). Il faut que tu changes l'arraylist en Liste_rdv.

  3. #3
    Membre expérimenté Avatar de Kazh Du
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 152
    Par défaut
    Simplement une TableModel n'hérite pas d'un ArrayList (et vice versa).
    Ce n'est pas un ArrayList que tu doit créer mais une instance de Liste_rdv (qui lui hérite d'ArrayList et de TableModel) et le passer en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Liste_rdv al = new Liste_rdv();
    JTable table = new JTable(al);

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    toutes mes confuses, c'était simple et je ne l'ai pas vu.

    merci

    olivier

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Je serais toi j'hériterai plutôt d'AbstractTableModel pour profiter de tout ce qu'apporte cette classe niveau modification, et j'utiliserai mon ArrayList en tant qu'attribut du modèle.

    Là tu designe un classe contenant bien trop de caractéristiques/méthodes pour son propre bien. Un bon design de code/API est de limiter les fonctionnalités offertes au strict de nécessaire.

    De plus on recommande globalement la composition plus que l'héritage. Dans le cas présent, le coté TableModel est obligatoire, le côté ArrayList absolument pas

    Un exemple d'implémentation propre de TableModel se basant sur une List (et non une ArrayList qui doit rester un détail d'implémentation
    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
    public class MonModele extends AbstractTableModel {
    	private List<MaLigne> mesLignes = new ArrayList<MaLigne>();
     
    	@overide
    	public void setValueAt(Object value, int row, int col) {
     
    		if( col == 0 ) {
    			mesLignes.get(row).setMachin(value);
    		} else if( col == 1 ) {
    			mesLignes.get(row).setTruc(value);
    		}
    		fireTableRowsUpdated(row,row);
    	}
     
    	@overide
    	public Object getValueAt( int row, int col ) {
     
    		if( col == 0 ) {
    			return mesLignes.get(row).getMachin();
    		} else if( col == 1 ) {
    			return mesLignes.get(row).getTruc();
    		}
    	}
     
    	@overide
    	public void addRow( MaLigne maNouvelleLigne ) {
    		mesLignes.add(maNouvelleLigne);
    		fireTableRowsInserted(mesLignes.size() - 1,mesLignes.size() - 1);
    	}
     
    	@overide
    	public void addRows( List<MaLigne> mesNouvellesLignes ) {
    		mesLignes.addAll(mesNouvellesLignes);
    		fireTableRowsInserted(mesLignes.size() - mesNouvellesLignes.size() - 1, mesLignes.size() - 1);
    	}
     
    	@overide
    	public void removeRow(int i) {
    		mesLignes.remove(i);
    		fireTableRowsDeleted(i);
    	}
     
    	@overide
    	public void removeRow( MaLigne maLigneASupprimer ) {
    		removeRow(mesLignes.indexOf(maLigneASupprimer));
    	}
     
    	@overide
    	public int getRowCount() {
    		return mesLignes.size();
    	}
     
    	@overide
    	public int getRowCount() {
    		return 2;
    	}
     
    	//.... Et ainsi de suite pour les autres méthodes du modèle .... ////
     
    }

Discussions similaires

  1. object.equals et arraylist.contains ne marche pas
    Par bobby51 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 10/03/2009, 10h36
  2. ArrayList : pourquoi .Contains ne marche pas ?
    Par NeoGeoo dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 05/03/2009, 14h18
  3. Réponses: 4
    Dernier message: 29/05/2007, 17h04
  4. 'SHOW TABLES' marche pas sous postgresql !?
    Par fet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2004, 09h28
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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