Publicité
+ Répondre à la discussion Actualité déjà publiée
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 38
  1. #1
    Expert Confirmé Sénior
    Avatar de Baptiste Wicht
    Homme Profil pro Baptiste Wicht
    Étudiant
    Inscrit en
    octobre 2005
    Messages
    7 433
    Détails du profil
    Informations personnelles :
    Nom : Homme Baptiste Wicht
    Âge : 26
    Localisation : Suisse

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

    Informations forums :
    Inscription : octobre 2005
    Messages : 7 433
    Points : 19 362
    Points
    19 362

    Par défaut Création de tableaux (JTable) avec Swing

    Bonsoir,

    Je viens de finir un article sur Swing : Création interface graphique avec Swing : les tableaux (JTable)

    Je tente d'expliquer les différents concepts liés à l'utilisation de tableaux en Swing. Dans cet article, nous verrons donc les concepts de base du composant JTable, la définition de modèle de tableaux, la modification dynamique du contenu du tableau, la façon de modifier l'affichage des différentes cellules du tableau, la modification directe du contenu du tableau et finalement le tri et le filtrage du tableau.

    En espérant qu'il vous soit utile

    Baptiste Wicht

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : juillet 2006
    Messages : 766
    Points : 984
    Points
    984

    Par défaut

    Pas mal de fonctionnalité, avec du bon code réutilisable. Beau travail !

    J'en profite quand même pour réintroduire mon vieil article sur les JTables, plus court, et différent (moins de fonctionnalités, et un poil plus de TableColumn et Events).

    J'adore la programmation Swing, c'est très agréable à programmer. Dommage que ce soit obsolète pour x raisons étranges.

  3. #3
    Membre confirmé Avatar de vintz72
    Profil pro Vincent
    Inscrit en
    octobre 2005
    Messages
    154
    Détails du profil
    Informations personnelles :
    Nom : Vincent
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : octobre 2005
    Messages : 154
    Points : 220
    Points
    220

    Par défaut

    Citation Envoyé par nicorama Voir le message
    Pas mal de fonctionnalité, avec du bon code réutilisable. Beau travail !
    [...]
    J'adore la programmation Swing, c'est très agréable à programmer. Dommage que ce soit obsolète pour x raisons étranges.
    Bien d'accord pour le premier point.
    Pour le second... bof. J'avoue que je m'y suis habitué, et il y a des aspects sympas, mais en somme, je trouve quand même plutôt lourd le Swing. Il faut souvent parcourir plusieurs objets avant d'obtenir une information triviale (ex récent pour moi: je voulais définir un renderer spécial sur une colonne donnée. Le faire pour une classe donnée n'était pas possible étant donné que plusieurs colonnes sont de type "Date". Et bien il faut éplucher la Javadoc pour trouver qu'il faut passer par le TableModel pour récupérer la bonne colonne ! J'ai eu des exemples pires, mais je ne me rappelle plus en détail). En outre, il manque une vision haut niveau du paradigme MVC. J'utilise un framework propriétaire pour palier cela, mais de base, Swing, ça manque quand même de beaucoup de choses.
    A sa décharge, il est vrai qu'il est plus ou moins abandonné par Sun au profit de JavaFX... le même tutoriel (sur les JTable) avec ce dernier serait intéressant !

  4. #4
    Invité régulier
    Profil pro
    Inscrit en
    août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Belgique

    Informations forums :
    Inscription : août 2007
    Messages : 5
    Points : 6
    Points
    6

    Par défaut un grand merci

    Bonjour,

    Pour mon projet, je galère un peu avec ces fameuses jTable ;o)

    Bon boulot !

  5. #5
    Invité de passage
    Inscrit en
    janvier 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : janvier 2006
    Messages : 3
    Points : 3
    Points
    3

    Par défaut Merci

    Merci pour l'article.

    La lecture du code source de la démo Swing fourni avec le JDK est aussi intéressante. C'est aussi dispo en Web Start sur : https://swingset3.dev.java.net .

  6. #6
    Expert Confirmé Sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 148
    Points : 19 042
    Points
    19 042

    Par défaut

    Salut,

    Très bon article sur les JTables ! Cela manquait



    J'ai deux petites remarques (mais c'est vraiment des bricoles --- j'aime bien chipoté ) :


    Tu peux éviter de supprimer le texte des cellule avec setText("") tout simplement en évitant de passer "value" à la méthode parente, par exemple :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    class ColorCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, null, isSelected, hasFocus, row, column);
            setBackground( (Color)value );
            return this;
        }
    }



    Dans ton SexeCellRenderer tu précharges une fois pour toute les images pour éviter de les recréer à chaque appel. C'est bien mais on pourrait faire la même chose dans le BoldCellRenderer pour éviter de multiplier les créations de Font dérivée :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class BoldCellRenderer extends DefaultTableCellRenderer {
     
    	private final Font boldFont = getFont().deriveFont(Font.BOLD);
     
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column) {
    		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    		setFont(this.boldFont);
    		return this;
    	}
    }




    Enfin je finirais avec une petite astuce : il est possible d'alterner les couleurs de fond des cellules assez facilement. Par example pour alterner avec un jaune pale :
    Code :
    UIManager.put("Table.alternateRowColor", new Color(255, 255, 204));
    Cela fonctionne tant qu'on ne modifie pas explicitement la couleur de fond et qu'on hérite bien de DefaultCellRenderer pour tous nos renderer (ce que je conseillerais d'ailleurs pour la plupart des renderers).

    Toutefois, il faut penser que cela impactera toutes les JTables de l'application...


    a++

  7. #7
    Expert Confirmé Sénior
    Avatar de Baptiste Wicht
    Homme Profil pro Baptiste Wicht
    Étudiant
    Inscrit en
    octobre 2005
    Messages
    7 433
    Détails du profil
    Informations personnelles :
    Nom : Homme Baptiste Wicht
    Âge : 26
    Localisation : Suisse

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

    Informations forums :
    Inscription : octobre 2005
    Messages : 7 433
    Points : 19 362
    Points
    19 362

    Par défaut

    Merci pour vos commentaires

    Citation Envoyé par adiGuba Voir le message
    Tu peux éviter de supprimer le texte des cellule avec setText("") tout simplement en évitant de passer "value" à la méthode parente, par exemple :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    class ColorCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, null, isSelected, hasFocus, row, column);
            setBackground( (Color)value );
            return this;
        }
    }
    C'est pas con, j'y avais même pensé

    Dans ton SexeCellRenderer tu précharges une fois pour toute les images pour éviter de les recréer à chaque appel. C'est bien mais on pourrait faire la même chose dans le BoldCellRenderer pour éviter de multiplier les créations de Font dérivée :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class BoldCellRenderer extends DefaultTableCellRenderer {
     
    	private final Font boldFont = getFont().deriveFont(Font.BOLD);
     
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column) {
    		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    		setFont(this.boldFont);
    		return this;
    	}
    }
    Très juste, j'avais oublié ça moi

    Enfin je finirais avec une petite astuce : il est possible d'alterner les couleurs de fond des cellules assez facilement. Par example pour alterner avec un jaune pale :
    Code :
    UIManager.put("Table.alternateRowColor", new Color(255, 255, 204));
    Cela fonctionne tant qu'on ne modifie pas explicitement la couleur de fond et qu'on hérite bien de DefaultCellRenderer pour tous nos renderer (ce que je conseillerais d'ailleurs pour la plupart des renderers).

    Toutefois, il faut penser que cela impactera toutes les JTables de l'application...

    a++
    Je vais l'inclure dans une section Divers, merci

    Je vais mettre à jour dans les jours qui viennent

  8. #8
    Membre régulier

    Développeur informatique
    Inscrit en
    janvier 2004
    Messages
    149
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2004
    Messages : 149
    Points : 72
    Points
    72

    Par défaut

    Citation Envoyé par vintz72 Voir le message
    Pour le second... bof. J'avoue que je m'y suis habitué, et il y a des aspects sympas, mais en somme, je trouve quand même plutôt lourd le Swing. Il faut souvent parcourir plusieurs objets avant d'obtenir une information triviale (ex récent pour moi: je voulais définir un renderer spécial sur une colonne donnée. Le faire pour une classe donnée n'était pas possible étant donné que plusieurs colonnes sont de type "Date".
    Pas faux, ceci dit c'est aussi ce qui en fait sa puissance, on peut faire énormément de choses avec. Pour quelque chose de trivial si on ne connaît il faut certes chercher un peu (et encore avec la javadoc c'est facile), mais après on est bien content lorsqu'on veut quelque chose de vraiment "sur mesure".

    Citation Envoyé par vintz72 Voir le message
    En outre, il manque une vision haut niveau du paradigme MVC. J'utilise un framework propriétaire pour palier cela, mais de base, Swing, ça manque quand même de beaucoup de choses.
    Heu déjà pourquoi veux-tu une vision haut niveau ? Ce sont des éléments de bas niveau justement... le haut niveau c'est ton application, pas les composants. De toute façon la plupart des composants n'utilisent pas le pattern MVC qui pour toute une série de raisons n'est pas approprié à ce niveau-ci d'abstraction, mais bien un modèle-vue où le contrôleur et la vue ont été couplées. Bon heu... je n'ai peut-être pas compris ta remarque non plus


    Sinon j'applaudis l'idée de ce tuto déjà pas mal complet. Vu le temps que j'ai dû passer plongé dans la javadoc et dans les tutos Sun pour apprendre à correctement m'en servir... ça pourra sûrement en aider plus d'un !

  9. #9
    Invité de passage
    Profil pro anis said
    Inscrit en
    novembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Nom : anis said

    Informations forums :
    Inscription : novembre 2009
    Messages : 3
    Points : 4
    Points
    4

    Par défaut Quelques remarques

    Merci , c'est un bon travail
    mais svp il manque un peu d'organisation de code, il faut indiquer où mettre chaque bout de code car ils sont séparés, et concernant le code de triage il n'a pas bien marché
    de même pour la modification de valeur de combobox de sport ;
    j'attends la modification de code

  10. #10
    Expert Confirmé Sénior
    Avatar de Baptiste Wicht
    Homme Profil pro Baptiste Wicht
    Étudiant
    Inscrit en
    octobre 2005
    Messages
    7 433
    Détails du profil
    Informations personnelles :
    Nom : Homme Baptiste Wicht
    Âge : 26
    Localisation : Suisse

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

    Informations forums :
    Inscription : octobre 2005
    Messages : 7 433
    Points : 19 362
    Points
    19 362

    Par défaut

    Citation Envoyé par mysina.25 Voir le message
    Merci , c'est un bon travail
    mais svp il manque un peu d'organisation de code, il faut indiquer où mettre chaque bout de code car ils sont séparés, et concernant le code de triage il n'a pas bien marché
    de même pour la modification de valeur de combobox de sport ;
    j'attends la modification de code
    L'entier du code est téléchargeable au dernier chapitre. Ce serait trop lourd d'inclure à chaque fois le code entier. Il me semble dèja que les explications sur l'inclusion du code sont suffisamment claires. Je vais encore essayer d'améliorer cela pour la prochaine version de l'article.

  11. #11
    Membre Expert Avatar de herve91
    Inscrit en
    novembre 2004
    Messages
    1 275
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 1 275
    Points : 1 426
    Points
    1 426

    Par défaut

    Citation Envoyé par adiGuba Voir le message
    Dans ton SexeCellRenderer tu précharges une fois pour toute les images pour éviter de les recréer à chaque appel. C'est bien mais on pourrait faire la même chose dans le BoldCellRenderer pour éviter de multiplier les créations de Font dérivée :
    Code :
    1
    2
    3
    public class BoldCellRenderer extends DefaultTableCellRenderer {
     
    	private final Font boldFont = getFont().deriveFont(Font.BOLD);
    Bonjour,
    pour chipoter un peu...
    C'est une bonne idée mais il faut être conscient que cela a des effets de bord ; en effet ici tu crées une fonte à partir de la fonte par défaut associée au JLabel (puisque DefaultTableCellRenderer hérite de JLabel). Or DefaultTableCellRenderer est initialement configuré pour "hériter" de la fonte de la JTable, ce qui n'est plus le cas ici. Ainsi, si la fonte de la JTable est modifiée, le BoldCellRenderer gardera la fonte initialement calculée. De plus il peut être problématique de partager le BoldCellRenderer entre différentes tables (de fonte différente).

  12. #12

    Inscrit en
    novembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 57
    Points : -3
    Points
    -3

    Par défaut

    Hello merci beaucoup pour ton tuto

    juste pour écrire moins avec des classes anonymes pour ceux qui les aiment c'est pas vraiment utile mais je trouve ça plus claire... :
    Code :
    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
    public class JTableBasiqueAvecPanelAvecScrollPaneEtModeleObjectDynamique extends javax.swing.JFrame {
        private ModeleObjectDynamique modele = new ModeleObjectDynamique();
        private JTable tableau = new JTable(modele);
     
        public JTableBasiqueAvecPanelAvecScrollPaneEtModeleObjectDynamique(){
            setTitle("JTable avec modèle dynamique");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER);
     
            JPanel boutons = new JPanel();
     
            boutons.add(new JButton(new AbstractAction("Ajouter") {
                public void actionPerformed(ActionEvent e) {
                    modele.addAmi(new Ami("Megan", "Sami", Color.green, false, Sport.NATATION));
                }
            }));
     
            boutons.add(new JButton(new AbstractAction("Supprimmer") {
                public void actionPerformed(ActionEvent e) {
                    int[] selection = tableau.getSelectedRows();
     
                    for(int i = selection.length - 1; i >= 0; i--){ modele.removeAmi(selection[i]);}
                }
            }));
     
            getContentPane().add(boutons, BorderLayout.SOUTH);
     
            pack();
        }
    à la place de :
    Code :
    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
    public class JTableBasiqueAvecModeleDynamiqueObjet extends JFrame{
        private ModeleDynamiqueObjet modele = new ModeleDynamiqueObjet();
        private JTable tableau;
     
        public JTableBasiqueAvecModeleDynamiqueObjet() {
            super();
     
            setTitle("JTable avec modèle dynamique");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            tableau = new JTable(modele);
     
            getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER);
     
            JPanel boutons = new JPanel();
     
            boutons.add(new JButton(new AddAction()));
            boutons.add(new JButton(new RemoveAction()));
     
            getContentPane().add(boutons, BorderLayout.SOUTH);
     
            pack();
        }
     
        public static void main(String[] args) {
            new JTableBasiqueAvecModeleDynamiqueObjet().setVisible(true);
        }
     
        private class AddAction extends AbstractAction {
            private AddAction() {
                super("Ajouter");
            }
     
            public void actionPerformed(ActionEvent e) {
                modele.addAmi(new Ami("Megan", "Sami", Color.green, false, Sport.NATATION));
            }
        }
     
        private class RemoveAction extends AbstractAction {
            private RemoveAction() {
                super("Supprimmer");
            }
     
            public void actionPerformed(ActionEvent e) {
                int[] selection = tableau.getSelectedRows();
     
                for(int i = selection.length - 1; i >= 0; i--){
                    modele.removeAmi(selection[i]);
                }
            }
        }
    }
    PS : ça marchera pas avec un copier/coller je me suis approprié les noms et j'ai fait un main séparé

  13. #13
    Expert Confirmé Sénior
    Avatar de Baptiste Wicht
    Homme Profil pro Baptiste Wicht
    Étudiant
    Inscrit en
    octobre 2005
    Messages
    7 433
    Détails du profil
    Informations personnelles :
    Nom : Homme Baptiste Wicht
    Âge : 26
    Localisation : Suisse

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

    Informations forums :
    Inscription : octobre 2005
    Messages : 7 433
    Points : 19 362
    Points
    19 362

    Par défaut

    Effectivement, ça va aussi marcher très bien, même si personnellement, je trouve ça plus lourd comme syntaxe. Comme quoi, les goûts et les couleurs

    Sinon, la version avec les classes internes plutôt plutôt qu'anonyme a un avantage si on veut aussi permettre d'utiliser ces actions via un menu ou un raccourci clavier, ce qui n'est pas faisable avec une classe anonyme à moins de dupliquer du code.

  14. #14
    Membre expérimenté
    Inscrit en
    avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : avril 2006
    Messages : 853
    Points : 549
    Points
    549

    Par défaut

    quand tu ajoutes un élément, ton élément est statique... ce n'est pas l'utilisateur qui l'entre....

    comment tu ferais pour que ça soit l'utilisateur qui entre la ligne de donnée au complet?

    il y a ajout d'une ligne vide via un bouton... ou bien il y en a toujours une de vide... ensuite ajout des donnée de l'utilisateur ? ou ces changements seraient fait?

  15. #15
    Expert Confirmé Sénior
    Avatar de Baptiste Wicht
    Homme Profil pro Baptiste Wicht
    Étudiant
    Inscrit en
    octobre 2005
    Messages
    7 433
    Détails du profil
    Informations personnelles :
    Nom : Homme Baptiste Wicht
    Âge : 26
    Localisation : Suisse

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

    Informations forums :
    Inscription : octobre 2005
    Messages : 7 433
    Points : 19 362
    Points
    19 362

    Par défaut

    Citation Envoyé par robert_trudel Voir le message
    quand tu ajoutes un élément, ton élément est statique... ce n'est pas l'utilisateur qui l'entre....

    comment tu ferais pour que ça soit l'utilisateur qui entre la ligne de donnée au complet?

    il y a ajout d'une ligne vide via un bouton... ou bien il y en a toujours une de vide... ensuite ajout des donnée de l'utilisateur ? ou ces changements seraient fait?
    Comme dit dans l'article, pour que les données entrées soit ajoutées par l'utilisateur et non pas de manière statique, il faudrait construire une vue pour ajouter un Ami. Typiquement, ce serait un JDIalog avec un champ par valeur de Ami avec deux boutons Ok et Annuller et le bouton OK prendrait les valeurs de la vue pour les ajouter dans le modèle du tableau.

    Sinon, une autre solution, comme tu l'as dit, un bouton pour rajouter une ligne vide et ensuite l'utilisateur fait les modifications directement dans le tableau, mais ce n'est pas à mon avis, le choix le plus ergonomique.

  16. #16
    Membre expérimenté
    Inscrit en
    avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : avril 2006
    Messages : 853
    Points : 549
    Points
    549

    Par défaut

    Citation Envoyé par Baptiste Wicht Voir le message
    Comme dit dans l'article, pour que les données entrées soit ajoutées par l'utilisateur et non pas de manière statique, il faudrait construire une vue pour ajouter un Ami. Typiquement, ce serait un JDIalog avec un champ par valeur de Ami avec deux boutons Ok et Annuller et le bouton OK prendrait les valeurs de la vue pour les ajouter dans le modèle du tableau.

    Sinon, une autre solution, comme tu l'as dit, un bouton pour rajouter une ligne vide et ensuite l'utilisateur fait les modifications directement dans le tableau, mais ce n'est pas à mon avis, le choix le plus ergonomique.
    pourquoi c'est le choix que la plupart des applications de gestions font...

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    février 2009
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : février 2009
    Messages : 355
    Points : 394
    Points
    394

    Par défaut Super !

    Merci pour ce tuto qui m'a bien aidé

    j'ai quand même une question .... J'ai vue dans la doc de TableModel que la méthode getColumnName doit retourner une String. Hors je voudrais mettre une checkbox pour permettre de tout sélectionner ou pas. Je sais pas quoi faire, j'ai peur qu'on puisse pas. Auriez-vous une idée?

    Merci mec

  18. #18
    Expert Confirmé Sénior
    Avatar de Baptiste Wicht
    Homme Profil pro Baptiste Wicht
    Étudiant
    Inscrit en
    octobre 2005
    Messages
    7 433
    Détails du profil
    Informations personnelles :
    Nom : Homme Baptiste Wicht
    Âge : 26
    Localisation : Suisse

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

    Informations forums :
    Inscription : octobre 2005
    Messages : 7 433
    Points : 19 362
    Points
    19 362

    Par défaut

    Oui, c'est possible. Tu peux spécifier un renderer pour les header.

    Un exemple ici : http://www.codeguru.com/java/articles/664.shtml

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    février 2009
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : février 2009
    Messages : 355
    Points : 394
    Points
    394

    Par défaut

    Super !! je vais regarder ca de plus près , merci

  20. #20
    Rédacteur

    Avatar de SheikYerbouti
    Inscrit en
    mai 2003
    Messages
    6 751
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 6 751
    Points : 10 554
    Points
    10 554

    Par défaut

    Merci
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •