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 avec des JPanel dans les cellule


Sujet :

Composants Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut JTable avec des JPanel dans les cellule
    Bonjour

    je souhaite remplacer ou remplir au choix les cellule d'une JTable par des JPanel ... et donc que dans la petite case il y est mon Panel ... est ce possible ?

    merci d'avance ..

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Oui : CellRenderer et CellEditor. recherche sur le forum, et accessoirement dans les tutos de sun pour comprendre comment celà fonctionne.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    j'ai chercher un peu sur le forum ... j'ai fait un détour par les tuto de java ( plutot bien fait d'ailleur ) mais je ne comprend pas comment modifier le renderer .. je ne saisie pas bien cette notion ...

    quelqu'un a t'il une adresse utile ou qui vaut la peine d'etre vu ?
    ou mieux quelqu'un qui a la patience de m'expliquer ?

    voila merci

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Bon je me suis posé la même question il y'a 2 semaines alors je vais t'expliquer car je comprend que t'ai pas envie de te taper la doc en anglais.

    Pour afficher une cellule en x,y la table demande a son model avec getValueAt et utilise un CellRenderer pour afficher le type de donnée retournée.

    Pour modifier la cellule en x,y la table va rechercher la valeur getValueAt, l'affiche et appelle la méthode setValueAt quand elle est validée.

    Si tu ne lui spécifie rien, la table va utiliser un renderer et un celleditor par défaut.

    Dans ton cas c'est l'affichage qui compte. Tu dois donc utiliser un cellrenderer. Il existe plusieurs solutions, soit tu définit un renderer pour un type de donnée ou pour une colonne.

    Dans le premier cas imaginons que tu ai un TableModel qui contient des objets "Personne" et que tu veuilles afficher l'age de la personne ainsi qu'une couleur en fonction du sexe dans le tableau.

    Dans la méthode getValueAt(x,y) de ton modèle tu retourne l'objet personne et dans ton renderer tu utilise la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    Elle retourne un Component (un jpanel par exemple ) et elle récupère entre autre l'objet renvoyé par ton TableModel : value

    Dans l'exemple de l'objet personne, on pourrait donc imaginer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    {
         Personne personne = (Personne)value;
         String age = ""+personne.getAge;
         Jpanel panel = new Jpanel;
         panel.setLayout(new GridLayout(1,1);
         Jlabel label = new JLabel(age);
         panel.add(label);
     
         if( sexe.equals("M") )      panel.setBackground(Color.BLUE);
         else                        panel.setBackground(Color.PINK);
     
         return panel;
    }
    Il ne reste plus qu'a spécifier à la JTable ton renderer pour les objets de Type "Personne":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.setDefaultRenderer(Personne.class,new RendererPersonne());

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    ok tout va bien jusque qua la derniere partie ...
    je dois le specifier le renderer de ma classe en l'instanciant ?? mais je n'est pas de renderer dans ma classe je ne comprend pas bien

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Voila en tres tres gros le code que je suis en train d'ecrire est ce que c'est la bonne maniere de s'y prendre pour le renderer ... parce que la ca ne fonctionne pas


    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
    import javax.swing.table.* ;
    import javax.swing.* ;
    import java.awt.* ;
    import java.awt.event.* ;
    import java.util.* ;
    public class DayTable extends JPanel implements Observer{
        // protected String[] DAYS= { "Samedi","Dimanche","Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"};
        protected JTable table ;
        protected GregorianCalendar calendar ;
        protected Agenda agenda ;
        /** Creates a new instance of DayTable */
        public DayTable(Agenda agenda) {
            this.setSize(600, 600);
            this.agenda = agenda;
            this.agenda.addObserver(this);
            this.calendar = agenda.getCurrentDate() ;
     
            table = new JTable(17, 2);
     
            table.setDefaultRenderer(Task.class,new MonRenderer());
     
            JScrollPane pane = new JScrollPane(table);
     
        }
    }
     
     
     
    class MonRenderer implements TableCellRenderer {
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Task t = (Task)value;
            String libelle = t.getLibelle();
            JPanel panel = new JPanel();
            panel.setLayout(new GridLayout(1,1));
            JLabel label = new JLabel(libelle);
            panel.add(label);
     
            panel.setBackground(Color.BLUE);
     
            return panel;
        }
     
    }

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    j'ai essayer tout un tas de chose depuis hier mais rien ne semble y faire

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En même temps si tu ne mets aucune task dans ta JTable, tu ne rique pas de voire le rendere en action (en l'occurence tu ne mets rien pour l'instant dans ta table) donc forcément, le renderer spécifique à Task n'est surement pas instancié
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    hooo oui ...
    enfin je l'est ajoute interactivement avec une vue fait adequat dont sisi il y a des tasks dans les cellules ...

    (j'aurai du le preciser :$ )

  11. #11
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Tient voila un exemple qui marche
    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
     
    import javax.swing.event.TableModelListener;
    import javax.swing.table.* ;
    import javax.swing.* ;
    import java.awt.* ;
    import java.util.* ;
     
     
    public class DayTable extends JPanel {
        // protected String[] DAYS= { "Samedi","Dimanche","Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"};
        private JTable table ;
        /** Creates a new instance of DayTable */
        public DayTable(int a) {
     
     
            SuperModel model = new SuperModel();
            table = new JTable(model);    
            table.setDefaultRenderer(Task.class,new MonRenderer());
     
            JScrollPane pane = new JScrollPane();
            this.add(pane);
            pane.setViewportView(table);
     
        }
     
        public static void main(String[] args)
        {
            JFrame frame = new JFrame("super test");
            frame.setLayout(new GridLayout(1,1));
            frame.add(new DayTable(2));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
     
     
        }
    }
     
    class SuperModel implements TableModel
    {
        String[] titres = {"titre1","titre2","titre3","titre4","titre5"};
     
        Task[][] datas = new Task[5][3];
     
        public SuperModel()
        {
     
            for(int i=0;i<5;i++)
            {
                for(int j=0;j<3;j++)
                {
                    datas[i][j] = new Task("[" + i + "-" + j + "]");
                }
            }
     
        }
     
     
        public int getRowCount()
        {
     
            return 3;
        }
     
        public int getColumnCount()
        {
            return 5;
        }
     
        public String getColumnName(int columnIndex)
        {
     
            return titres[columnIndex];
        }
     
        public Class<?> getColumnClass(int columnIndex)
        {
            return Task.class;
        }
     
        public boolean isCellEditable(int rowIndex, int columnIndex)
        {
            return false;
        }
     
        public Object getValueAt(int rowIndex, int columnIndex)
        {
            return datas[columnIndex][rowIndex];
        }
     
        public void setValueAt(Object aValue, int rowIndex, int columnIndex)
        {
            // pas éditable
        }
     
        public void addTableModelListener(TableModelListener l)
        {
     
        }
     
        public void removeTableModelListener(TableModelListener l)
        {
     
        }
     
    }
     
    class Task
    {
        private String libelle;
     
        public Task(String lib)
        {
            setLibelle(lib);
        }
     
        public String getLibelle()
        {
            return libelle;
        }
     
        public void setLibelle(String libelle)
        {
            this.libelle = libelle;
        }
     
     
    }
     
     
    class MonRenderer implements TableCellRenderer {
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Task t = (Task)value;
            String libelle = t.getLibelle();
            JPanel panel = new JPanel();
            panel.setLayout(new GridLayout(1,1));
            JLabel label = new JLabel(libelle);
            panel.add(label);
     
            if((row+column)%2 == 1)
            {
                panel.setBackground(Color.WHITE);
                label.setForeground(Color.BLACK);
     
            }
            else    
            {
                panel.setBackground(Color.BLACK);
                label.setForeground(Color.WHITE);
            }
     
            return panel;
        }
     
    }

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    haaaaaaa !

    Impecable je l'est modifie run peu et ca fonctionne a merveille voila un probleme résolu !

    Merci bien

Discussions similaires

  1. DataGridView et format des valeurs dans les cellules
    Par saultapt dans le forum Windows Forms
    Réponses: 5
    Dernier message: 17/06/2008, 16h55
  2. Afficher des Couleurs dans les Cellules automatiquement
    Par dreams11 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/11/2007, 22h17
  3. [JTable] mettre deS checkbox dans une cellule
    Par Lady dans le forum Composants
    Réponses: 11
    Dernier message: 05/09/2007, 12h21
  4. Réponses: 3
    Dernier message: 04/04/2007, 14h18
  5. Jtable et multi-lignes dans les cellules
    Par tuxor dans le forum Composants
    Réponses: 2
    Dernier message: 19/11/2005, 07h32

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