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 :

[filtrage] Jtable, header disparu


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 149
    Par défaut [filtrage] Jtable, header disparu
    Bonjour,

    encore merci à sinok qui m'a fourni un très bon lien pour les filtres de JList
    (j'ai adapté au Jtables pour mon problème)
    http://www-128.ibm.com/developerwork...ary/j-filters/

    voici mon code qui comporte 1 erreur ( au moins)
    (sinon, ca filtre comme je voulais )

    - je ne vois plus les headers (je les avais sans le filtre)

    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
    import java.util.ArrayList;
     
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableModel;
     
     
    public class filtre_couleurs  extends AbstractTableModelFilter {
    	//listes des indices "autorisés"
    	protected ArrayList indexList = new ArrayList();
        // Current State
        protected String state;
     
    	public filtre_couleurs(TableModel delegate) {
    		super(delegate);
    		this.setState("NONE");
    	}
     
    	 public synchronized void setState(String myState)
    	 {
    		 state = myState;
    		 indexList.clear();
    		 //indexList.add(new Integer());
     
    		 for(int i =0; i < delegate.getRowCount();i++)
    		 {
    			 if(delegate.getValueAt(i,0).equals(state)||state.equals("NONE"))
    				 indexList.add(new Integer(i));
    		 }
    		 this.fireTableDataChanged();
    	 }
     
    	 public int getRowCount() {
    		// TODO Auto-generated method stub
    		 return indexList.size();
    	}
     
    	public int getColumnCount() {
    		// TODO Auto-generated method stub
    		return delegate.getColumnCount();
    	}
     
    	public Object getValueAt(int arg0, int arg1) {
    		// TODO Auto-generated method stub
    		int newIndex = ((Integer) indexList.get(arg0)).intValue();
    		return delegate.getValueAt(newIndex, arg1);
    	}
     
    }
    abstract class AbstractTableModelFilter extends AbstractTableModel
    {
    	// Storage of reference to model being filtered
    	protected TableModel delegate;
     
    	// Constructor - takes a single parameter containing
    	// a reference to the model being filtered
    	public AbstractTableModelFilter(TableModel delegate)
    	{
    		this.delegate = delegate;
    	}
     
    	public TableModel getDelegate()
    	{
    		return this.delegate;
    	}
     
    	public Object getValueAt(int index, int index2)
    	{
    		// delegate to filter target
    		return delegate.getValueAt(index, index2);
    	}
     
    	public void addTableDataListener(TableModelListener listener)
    	{
    		// delegate to filter target
    		delegate.addTableModelListener(listener);
    	}
     
    	public void removeTableDataListener(TableModelListener listener)
    	{
    		// delegate to filter target
    		delegate.removeTableModelListener(listener);
    	}
    }
    il est appellé dans la fenètre principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    jpHistoProc.setLayout(new GridBagLayout());
     
        	filtre_couleurs mon_filtre = new filtre_couleurs(new MyTableModel());
     
        	//tri de la Jtable
    		TableSorter sorter = new TableSorter(mon_filtre);
     
            JTable  table2 = new JTable(sorter);
     
            sorter.setTableHeader(table2.getTableHeader());
    ( vous avez remarqué, il y a même un truc pour trier... c'est de la Jtable de compet')

    la méthode setState est changée grâce à des boutons

    merci

  2. #2
    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
    Tu n'aurais pas oublié de mettre ta table dans un JScrollPane par hasars?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 149
    Par défaut
    malheureusement, ce n'est pas ca.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    table2.setDefaultRenderer(java.lang.Object.class,new CellObjectRenderer());
     
     
    		JScrollPane spHisto = new JScrollPane(table2);
    		table2.setPreferredScrollableViewportSize(new Dimension(100, 110));
    juste en dessous (le code est assez... pas encore rangé dira-t-on )

    le truc, c'est que sans le filtre, les headers étaient affichés !
    (je suis revenu en arrière et c'est bien le filtre qui pose problème, mais je ne sais pas à quel niveau)

  4. #4
    Membre expérimenté Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Par défaut
    Je suppose que sans le filtre ne redefinissait pas une methode heritant de AbstractTableModel.
    Je pense que c'est le fait de redefinir le model de ta table qui joue sur certains element.
    De plus dans tes classes fils tu n'appelles jamais le constructeur pere. Il faudrait peut etre rajouter un super() dans tes classes.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 149
    Par défaut
    merci de ta réponse,
    j'ai rajouté un super dans la 2e classe, mais cela n'a rien changé.

    je n'ai redéfini la classe que parce que c'était dans l'exemple et que je ne savais pas faire autrement.

  6. #6
    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
    Juste par hasard, tu n'aurais pas oublié d'implémenter la méthode getColumnName(int i) de ton AbstractModel pour qu'elle redirige cette méthode au delegate.
    Car pour l'instant tu essaies de chooper les noms de colonnes dans ton filter ou il ne sont pas définis

    Sinon autre chose une petite convention pour le nommage des classes en java: change filtre_couleur en FiltreCouleur (cf conventions sun pour en savoir plus)
    En général on n'utilise pas ou très peu d'underscore pour les noms en java, la séparation se fait avec un changement de casse.

    Les noms de classes commencent par une majuscule et celles des variables par une minuscule

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

Discussions similaires

  1. [JTable] Header ne s'affichent plus
    Par pascalouh dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 22/07/2008, 15h37
  2. [JTable] Header : le rendre plus "stable"
    Par Lady dans le forum Composants
    Réponses: 8
    Dernier message: 24/04/2007, 09h45
  3. [JTable] header renderer : pas d'effet
    Par Lady dans le forum Composants
    Réponses: 12
    Dernier message: 19/04/2007, 08h58
  4. [JTable][Header]Cherche à rendre 'dynamique' les header
    Par Hashitori dans le forum Composants
    Réponses: 1
    Dernier message: 07/04/2006, 17h13
  5. Probleme JTable Header et largeur colonnes
    Par Seth77 dans le forum Composants
    Réponses: 6
    Dernier message: 16/01/2006, 10h36

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