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

Agents de placement/Fenêtres Java Discussion :

JPanel dans JTable


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut JPanel dans JTable
    Bonjour,

    je planche actuellement sur un problème peut être basique mais dont je n'arrive pas à trouver de solution compréhensible.


    1) Je souhaite réaliser une JTable à 2 colonnes
    Solution: OK

    2) Je souhaite que la première colonne contienne un JPanel et la deuxième juste un champ Texte
    Solution: CellRenderer: OK

    3) Je souhaite mettre une seconde JTable (entre autre) dans le JPanel contenu dans la première.
    Solution: Affichage: OK
    ScrollBarre de la JTable: Ne fonctionne pas



    En gros, la scollBarre de la JTable qui est dans le Panel contenu dans une autre JTable ne fonctionne pas.

    La solution repose surement sur la redefinition d'un CellEditor mais je n'arrive pas à un faire un fonctionnel malgrès mes recherches.


    Dans un premier temps, je ne post pas mon code (un peu long) parce que je prefererai avoir un exemple / tuto pour le réaliser moi même.


    Merci de votre aide
    TBxMala

  2. #2
    Membre chevronné
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Par défaut
    Bonjour
    et si tu remplaçais le JPanel (qui est dans le premier JTable) qui contient le JTable par un JScrollPane qui contiendrai ton JTable directement ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut
    Ce n'est pas mon idée de base.

    Quand bien même, le probleme serait surement le même a savoir que la scoll barre ne serai pas interactive étant contenu dans la première JTable pour laquelle uniquement le Renderer est defini.


    A mon avis la solution repose sur l'implémentation du CellEditor pour gerer les interaction mais je ne sais pas comment faire. (enfin c'est mon avis)

  4. #4
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut
    Personne ne connait une solution ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut
    Pour expliciter encore mieux mon probleme, je vous montrer l'interface a proprement dites:

    http://imageshack.us/photo/my-images...acejtable.png/

    le but est de faire fonctionner la scrollbar et pourquoi pas les redimensions de colonne

    je trouve pas comment faire

  6. #6
    Membre chevronné
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Par défaut
    Bonjour
    Avoir une image de ce que tu veux c'est vrai que c'est mieux
    mais je te conseil de poster le bout de code aussi qui concerne ton problème, meme s'il est long.

  7. #7
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut
    classes metiers:
    Client,
    FactureEtDevis,
    daoFactureEtDevis,
    daoParametre.


    Modele de la table générale:
    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
    public class ModeleTableClientGroupe extends AbstractTableModel {
     
        private Map<Integer, Client> listeClient;
        private Map<Integer, Float> listeTotaux;
        private String[] nomColonnes = {"Client(s) :", "Total"};
        private DAOFactureEtDevis daoFactureEtDevis;
        private DAOParametre daoParametre;
     
        public ModeleTableClientGroupe() {
            listeClient = null;
        }
     
        public ModeleTableClientGroupe(Map<Integer, Client> liste, DAOFactureEtDevis dao1, DAOParametre dao2) {
            listeClient = liste;
            daoFactureEtDevis = dao1;
            daoParametre = dao2;
            listeTotaux = new TreeMap<>();
            List<String> listeLib = this.daoParametre.chargerLibelles();
            for (Client c: listeClient.values()) {
                float total = this.daoFactureEtDevis.chargerTotalContratEnCours(c.getId(), listeLib);
                listeTotaux.put(c.getId(), total);
            }
        }
     
        @Override
        public boolean isCellEditable(int columnIndex, int rowIndex) {
            return true;
        }
     
        @Override
        public Class getColumnClass(int columnIndex) {
            switch(columnIndex){
                case 0:
                    return PanelClientGroupe.class;
                case 1 :
                    return String.class;
                default :
                    return null;
            }
        }
     
        @Override
        public int getRowCount() {
            return listeClient.size();
        }
     
        @Override
        public int getColumnCount() {
            return nomColonnes.length;
        }
     
        @Override
        public String getColumnName(int col) {
            return nomColonnes[col];
        }
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            if (listeClient == null) {
                return null;
            }
            List<Client> listeTable = new ArrayList<>(listeClient.values());
            switch (columnIndex) {
                case 0:                
                    ConteneurInfoRendererGroupe client = new ConteneurInfoRendererGroupe(listeTable.get(rowIndex), daoParametre, daoFactureEtDevis);
                    return client;
                case 1:
                    String r = Float.toString(this.listeTotaux.get(listeTable.get(rowIndex).getId()));
                    return r;
                default:
                    return null;
            }
     
        }
     
        public Map<Integer, Client> getContract() {
            return listeClient;
        }
    }

    Renderer de la table générale:
    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
    public class TableRendererClientGroupe extends  DefaultTableCellRenderer{
     
     
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
     
            if (value instanceof ConteneurInfoRendererGroupe) {
                ConteneurInfoRendererGroupe client = (ConteneurInfoRendererGroupe)value;
                PanelClientGroupe panel = new PanelClientGroupe();
                panel.setData(client.getClient(), client.getDaoParametre(), client.getDaoFacture(), isSelected);
            return panel;
            } else {
                Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                return component;
            }
        }
     
    }
    Panel Contenu dans la colonne 0 de la table générale:
    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
    public class PanelClientGroupe extends javax.swing.JPanel {
     
        private Client client;
        private ModeleTableContract listeContract;
        private DAOParametre daoParametre;
        private DAOFactureEtDevis daoContract;
     
        public PanelClientGroupe() {
            initComponents();
     
        }
     
        public void setData(Client c, DAOParametre dao2, DAOFactureEtDevis dao3, boolean isSelected) {
            this.client = c;
            this.daoParametre = dao2;
            this.daoContract = dao3;
            this.listeContract = new ModeleTableContract(this.daoContract.chargerContract(this.client.getId(), this.daoParametre.chargerLibelles()));
            this.lNom.setText(this.client.getNom() + " " + this.client.getPrenom() + " , " + this.client.getCodeBarre());
            this.lAdresse1.setText(this.client.getAdresse1() + " , " + this.client.getAdresse2());
            this.lAdresse2.setText(this.client.getCP() + " , " + this.client.getVille() + " , " + this.client.getPays());
            this.lTelephone.setText(this.client.getTel1() + " , " + this.client.getTel2());
            this.lMail.setText(this.client.getAdresseMail());
            this.tContract.setModel(listeContract);
            this.tContract.setDefaultRenderer(Object.class, new TableRendererContract());
     
            if (isSelected) {
                this.setBackground(this.tContract.getSelectionBackground());
            } else {
                this.setBackground(this.tContract.getSelectionForeground());
            }
        }
     
     
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
     
            lNom = new javax.swing.JLabel();
            lAdresse1 = new javax.swing.JLabel();
            lAdresse2 = new javax.swing.JLabel();
            lTelephone = new javax.swing.JLabel();
            lMail = new javax.swing.JLabel();
            jScrollPane1 = new javax.swing.JScrollPane();
            tContract = new javax.swing.JTable();
     
            setMinimumSize(new java.awt.Dimension(395, 260));
     
            lNom.setFont(new java.awt.Font("Tahoma", 0, 22)); // NOI18N
            lNom.setText("jLabel1");
     
            lAdresse1.setText("jLabel1");
     
            lAdresse2.setText("jLabel1");
     
            lTelephone.setText("jLabel1");
     
            lMail.setText("jLabel1");
     
            tContract.setModel(new javax.swing.table.DefaultTableModel(
                new Object [][] {
     
                },
                new String [] {
     
                }
            ));
            tContract.setSelectionBackground(new java.awt.Color(204, 204, 204));
            jScrollPane1.setViewportView(tContract);
     
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
            this.setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addGap(15, 15, 15)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(lAdresse2)
                                .addComponent(lAdresse1)
                                .addComponent(lTelephone)
                                .addComponent(lMail)
                                .addComponent(lNom)))
                        .addGroup(layout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(10, 10, 10)
                    .addComponent(lNom)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(lAdresse1)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(lAdresse2)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(lTelephone)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(lMail)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)
                    .addContainerGap())
            );
        }// </editor-fold>                        
        // Variables declaration - do not modify                     
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JLabel lAdresse1;
        private javax.swing.JLabel lAdresse2;
        private javax.swing.JLabel lMail;
        private javax.swing.JLabel lNom;
        private javax.swing.JLabel lTelephone;
        private javax.swing.JTable tContract;
        // End of variables declaration                   
    }

    Modele de la sous-table:
    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
    public class ModeleTableContract extends AbstractTableModel {
     
        private Map<Integer, FactureEtDevis> listeFacturesEtDevis;
        private String[] nomColonnes = {"Libellé", "Du", "Au", "Total", "Montant"};
     
        public ModeleTableContract() {
            this.listeFacturesEtDevis = null;
        }
     
        public ModeleTableContract(Map<Integer, FactureEtDevis> table) {
            this.listeFacturesEtDevis = table;
        }
     
        @Override
        public int getRowCount() {
            return listeFacturesEtDevis.size();
        }
     
        @Override
        public int getColumnCount() {
            return nomColonnes.length;
        }
     
        @Override
        public String getColumnName(int col) {
            return nomColonnes[col];
        }
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            ArrayList<FactureEtDevis> listeFacture = new ArrayList<>(listeFacturesEtDevis.values());
            switch (columnIndex) {
                case 0:
                    return listeFacture.get(rowIndex).getLibelle();
                case 1:
                    return listeFacture.get(rowIndex).getDateCreation().toString();
                case 2:
                    return listeFacture.get(rowIndex).getDateEcheance().toString();
                case 3:
                    return Float.toString(listeFacture.get(rowIndex).getTotalAnnuel());
                case 4:
                    return Float.toString(listeFacture.get(rowIndex).getMontant());
                case -1:
                    return listeFacture.get(rowIndex).getDateEcheance();
                default:
                    return null;
            }
        }
     
        public Map<Integer, FactureEtDevis> getContract() {
            return listeFacturesEtDevis;
        }
    }

    Renderer de la sous-table:
    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
    public class TableRendererContract extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
            Calendar date = new GregorianCalendar();
            long mil = date.getTimeInMillis();
     
            java.sql.Date date2 = (java.sql.Date)table.getValueAt(row, -1);
            long mil2 = date2.getTime();
            if (mil < mil2) {
                component.setBackground(Color.GREEN);
            } else {
                component.setBackground(Color.ORANGE);
            }
     
            return component;
        }
    }
    Je crois que c'est tout ce qui est en rapport avec mon probleme

  8. #8
    Membre chevronné
    Avatar de Laine
    Femme Profil pro
    Doctorat informatique
    Inscrit en
    Mars 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorat informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 238
    Par défaut
    Bonjour
    regarde ce lien, il se peut qu'il puisse t'aider
    http://stackoverflow.com/questions/6...-jtable-column

  9. #9
    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
    Ca vient du concept même de CellRenderer.

    En effet, le CellRenderer ne fait que dessiner le contenu de la case, et n'est pas un composant à proprement parler (pas de gestion d'events & cie).

    Dans ton cas, je laisserai tomber la JTable englobante pour la remplacer par un layout répétant N fois ton JPanel.

  10. #10
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut
    Merci bien, j'espere que ça marchera.

    Je suis passé à autre chose en attendant des conseils, je m'y remettrai donc la semaine prochaine voir plus tard.

    Je ne m'y connais trop en Layout, si vous pouviez me conseiller un bon tuto pour maitriser le concept, ça serait vraiment super !

    Merci d'avance

Discussions similaires

  1. JTable dans Jpanel dans JOptionPane
    Par SheikYerbouti dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 14/11/2011, 19h46
  2. [JTable] Inserer un JPanel dans une cellule d'un JTable
    Par Babas007 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 13/04/2011, 11h13
  3. Réponses: 2
    Dernier message: 23/03/2011, 16h12
  4. Réponses: 0
    Dernier message: 23/03/2011, 01h23
  5. JTable avec des JPanel dans les cellule
    Par pigpen dans le forum Composants
    Réponses: 11
    Dernier message: 13/04/2006, 19h58

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