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

AWT/Swing Java Discussion :

Q: Comment atteindre l'objet JTabbedPane à partir de l'un de ses 'tab's ?


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut Q: Comment atteindre l'objet JTabbedPane à partir de l'un de ses 'tab's ?
    Bonjour.

    J'ai un JTabbedPane ("ensemblePanneauxÀOnglet") contenant N tabs et, dans la classe 'EETP' contenant ce JTabbedPane, aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            tabPnl_1 = new TabPan_1();
            ensemblePanneauxÀOnglet.addTab(" Tab 1 ", null, tabPnl_1, "Liste de ...");
     
            tabPnl_2 = new TabPan_2();
            ensemblePanneauxÀOnglet.addTab(" Tab 2 ", null, tabPnl_2, "Sert à ...");
    Chaque TabPan_i fait l'objet d'une classe séparée.
    J'ai besoin de passer quelques données du tabPnl_2 vers le tabPnl_1, par exemple.
    Je ne trouve pas par quelle instruction - du genre 'getOwningJTabbedPane()' et employée dans la classe 'TabPan_2 extends JPanel' - je pourrais atteindre 'ensemblePanneauxÀOnglet', et donc aussi 'ensemblePanneauxÀOnglet.getTabPnl_1()'. Le sauriez-vous ?

    Ma solution actuelle consiste à passer en paramètre 'ensemblePanneauxÀOnglet' (ou 'EETP' qui contient ce JTabbedPane) en argument au constructeur de 'TabPan_2'.

    Merci d'avance de tenter de m'éclairer.
    Merci Tchize, Joël Drigo, ...
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    C'est dommage de lier le transfert de données via un objet graphique. Il faudrait penser à séparer tout ça.
    Un exemple possible : tabPnl_1 implémente une interface Toto avec quelques méthodes. L'instance est transmise à tabPnl_2 en tant qu'objet Toto.
    tabPnl_2 va pouvoir appeler les méthodes de tabPnl_1 en l'utilisant comme un objet Toto.
    Avec cette technique, il n'y a plus aucun lien avec la solution d'affichage choisie.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Merci pour ta réponse, Dinobogan.

    Interfaces, je pense connaître. Mais pour implémenter ce que tu conseilles, je ne vois pas encore assez bien.

    Ci-dessous le code minimal d'une applic avec JTabbedPane, classes de 'tab's à part et interfaces. Pourrais-tu les terminer ?

    Classe PanneauÀOnglets.java
    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
    /*
     */
    package panneauàonglets;
     
    import javax.swing.JTabbedPane;
    import javax.swing.ImageIcon;
    import javax.swing.JPanel;
    import javax.swing.JFrame;
    import javax.swing.JComponent;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.KeyEvent;
     
     
    /**
     * Copié de Java Tutorials - How to use tabbed panes
     * https://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html
     * 
     */
    public class PanneauÀOnglets extends JPanel
    {
        // <editor-fold defaultstate="collapsed" desc="Déclarations des variables">
     
     
        // </editor-fold>
     
        public PanneauÀOnglets()
        {
            // <editor-fold defaultstate="collapsed" desc="Initialisation des variables">
            JTabbedPane ensemblePanneauxÀOnglet = new JTabbedPane();
            ImageIcon icon = createImageIcon("images/middle.gif");
     
            // Overridable method call 'makeTextPanel()' in constructor
            JComponent tabPnl_1 = new TabPan_1();   // makeTextPanel("Panneau #1")
            ensemblePanneauxÀOnglet.addTab("Tab 1", icon, tabPnl_1, "Does nothing");
            ensemblePanneauxÀOnglet.setMnemonicAt(0, KeyEvent.VK_1);
     
            JComponent tabPnl_2 = new TabPan_2();   // makeTextPanel("Panneau #2")
            ensemblePanneauxÀOnglet.addTab("Tab 2", icon, tabPnl_2, "Does twice as much nothing");
            ensemblePanneauxÀOnglet.setMnemonicAt(1, KeyEvent.VK_2);
     
            JComponent tabPnl_3 = new TabPan_3();   // makeTextPanel("Panneau #3");
            tabPnl_3.setPreferredSize(new Dimension(410, 50));
            ensemblePanneauxÀOnglet.addTab("Tab 3", icon, tabPnl_3, "Does nothing at all");
            ensemblePanneauxÀOnglet.setMnemonicAt(2, KeyEvent.VK_3);
     
            //Add the tabbed pane to this panel.
            add(ensemblePanneauxÀOnglet);
     
            //The following line enables to use scrolling tabs.
            ensemblePanneauxÀOnglet.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
     
            //  -     -     -     -     -     -     -     -     -     -     -
     
            // </editor-fold>
        }
     
     
        /** Returns an ImageIcon, or null if the path was invalid.
         * @param path
         * @return 
         */
        protected static ImageIcon createImageIcon(String path)
        {
            java.net.URL imgURL = PanneauÀOnglets.class.getResource(path);
            if (imgURL != null)
            {
                return new ImageIcon(imgURL);
            } else
            {
                System.err.println("Couldn't find file: " + path);
                return null;
            }
        }
     
     
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the event dispatch thread.
         */
        private static void createAndShowGUI()
        {
            //Create and set up the window.
            JFrame frame = new JFrame("Panneau à onglets");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            //Add content to the window.
            frame.add(new PanneauÀOnglets(), BorderLayout.CENTER);
     
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
     
     
        public static void main(String[] args)
        {
            // Schedule a job for the event dispatch thread:
            // creating and showing this application's GUI.
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {   //Turn off metal's use of bold fonts
                    UIManager.put("swing.boldMetal", Boolean.FALSE);
                    createAndShowGUI();
                }
            }       );
        }
    }
    Classe TabPan_1
    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
    /*
     */
    package panneauàonglets;
     
    import java.math.BigDecimal;
    import javax.swing.JPanel;
    import javax.swing.JLabel;
    import java.awt.GridLayout;;
     
     
    /**
     *
     */
    public class TabPan_1 extends JPanel implements Interf
    {
        // <editor-fold defaultstate="collapsed" desc="Déclarations des variables">
        BigDecimal valeurDéc;
     
        // </editor-fold>
     
        public TabPan_1()
        {
            JLabel filler = new JLabel("Panneau #1");
            filler.setHorizontalAlignment(JLabel.CENTER);
            this.setLayout(new GridLayout(1, 1));
            this.add(filler);
     
            valeurDéc = new BigDecimal("11");
    //        this.add(valeurDéc);
        }
     
        @Override public BigDecimal getDonnées_Panneau()
        {
     
            return valeurDéc;     // À remplacer
        }
     
        @Override public void setDonnées_Panneau(BigDecimal donnée)
        {
     
        }
     
    }
    Classe TabPan_2
    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
    /*
     */
    package panneauàonglets;
     
    import java.math.BigDecimal;
    import javax.swing.JPanel;
    import javax.swing.JLabel;
    import java.awt.GridLayout;;
     
     
    /**
     * 
     */
    public class TabPan_2 extends JPanel implements Interf
    {
        // <editor-fold defaultstate="collapsed" desc="Déclarations des variables">
        BigDecimal valeurDéc;
     
        // </editor-fold>
     
        public TabPan_2()
        {
            JLabel filler = new JLabel("Panneau #2");
            filler.setHorizontalAlignment(JLabel.CENTER);
            this.setLayout(new GridLayout(1, 1));
            this.add(filler);
     
            valeurDéc = new BigDecimal("22");
        }
     
        @Override public BigDecimal getDonnées_Panneau()
        {
     
            return valeurDéc;     // À remplacer
        }
     
        @Override public void setDonnées_Panneau(BigDecimal donnée)
        {
     
        }
     
    }
    Classe TabPan_3
    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
    /*
     */
    package panneauàonglets;
     
    import java.math.BigDecimal;
    import javax.swing.JPanel;
    import javax.swing.JLabel;
    import java.awt.GridLayout;
     
     
    /**
     *
     */
    public class TabPan_3 extends JPanel implements Interf
    {
        // <editor-fold defaultstate="collapsed" desc="Déclarations des variables">
        BigDecimal valeurDéc;
     
        // </editor-fold>
     
        public TabPan_3()
        {
            JLabel filler = new JLabel("Panneau #3");
            filler.setHorizontalAlignment(JLabel.CENTER);
            this.setLayout(new GridLayout(1, 1));
            this.add(filler);
     
            valeurDéc = new BigDecimal("33");
        }
     
        @Override public BigDecimal getDonnées_Panneau()
        {
     
            return valeurDéc;     // À remplacer
        }
     
        @Override public void setDonnées_Panneau(BigDecimal donnée)
        {
     
        }
     
    }
    Interface
    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
    /*
     */
    package panneauàonglets;
     
    import java.math.BigDecimal;
     
    /**
     *
     */
    public interface Interf
    {
        public BigDecimal getDonnées_Panneau();
     
        public void setDonnées_Panneau(BigDecimal donnée);
     
    }
    s'il n'y a plus trop de travail ?
    Rappel : Pour qu'une donnée dans une classe TabPan_i soit accessible depuis une autre classe TabPan_i , indépendamment des objets Swing (JTabbedPane, JPanel).

    Merci d'avance.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Lorsqu'on fait des interfaces homme-machines un peu évoluées, on s'oriente vers une architecture MVC (Modèle, Vue, Contrôlleur). Implémenter des interfaces sur les composants graphiques est une version intermédiaire entre un MVC, et faire un amas de composants graphiques qui s'appellent les uns les autres en passant par leur hiérarchie (getParent()/getChildren()).

    L'avantage d'un MVC est qu'on sépare le code en trois parties relativement indépendantes (le controlleur peut être assez dépendant de la vue, parce qu'il doit pouvoir traiter les composants graphiques réellement, comme écouter des actions sur des boutons par exemple).

    Donc :
    • M : le modèle chargé de stocker les données : il ignore tout de la vue ou du controlleur
    • V : la vue, qui fait l'affichage, en reflétant les données du modèle (elle écoute les modifications du modèle pour savoir se mettre à jour comme elle le désire)
    • C : le contrôlleur chargé de réagir aux actions (bouton, slider, saisie...), de modifier les données du modèle au besoin, de modifier la vue éventuellement



    Voici un exemple très simple de MVC (le controlleur ici est réduit à un DocumentListener), pour illustrer comment on peut modifier des données dans une vue (peu importe ce que c'est), et afficher en conséquence l'affichage dans une autre vue, peu importe ce qu'elle est.

    Le modèle : ici, pour simplifier, il ne stocke qu'une seule information, DATA
    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
    public class Model {
     
    	public static final String DATA_PROPERTY = "DATA";
     
    	private final SwingPropertyChangeSupport propertyChangeSupport = new SwingPropertyChangeSupport(this, true);
    	private String data;
     
    	public Model() {
    		data="";
    	}
     
    	public void setData(String data) {
    		String oldData=this.data;
    		this.data=data;
    		propertyChangeSupport.firePropertyChange(DATA_PROPERTY, oldData, data);
    	}
     
    	public String getData() {
    		return data;
    	}
     
    	public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    		propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
    	}
     
    	public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    		propertyChangeSupport.removePropertyChangeListener(propertyName, listener);
    	}
     
    }
    2 vues :
    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
    public class Tab1 extends JPanel {
     
    	private final Model model;
     
    	public Tab1(Model model) {
    		this.model=model;
    		JTextField field = new JTextField(20);
    		add(field);
                    // le contrôlleur met à jour le modèle en fonction de la saisie dans cette vue
    		field.getDocument().addDocumentListener(new DocumentListener() {
     
    			@Override
    			public void removeUpdate(DocumentEvent e) {
    				model.setData(field.getText());
    			}
     
    			@Override
    			public void insertUpdate(DocumentEvent e) {
    				model.setData(field.getText());
    			}
     
    			@Override
    			public void changedUpdate(DocumentEvent e) {
    				model.setData(field.getText());
    			}
    		});
    	}
     
    }
    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
    public class Tab2 extends JPanel {
     
    	private final Model model;
     
    	public Tab2(Model model) {
    		this.model=model;
    		JLabel label = new JLabel();
    		add(label);
    		updateLabel(label);
                    // cette vue écoute le modèle pour répercuter les modifications de DATA dans l'affichage (label)
    		model.addPropertyChangeListener(Model.DATA_PROPERTY, e-> updateLabel(label));
    	}
     
    	private void updateLabel(JLabel label) {
    		label.setText(String.valueOf(model.getData().length()));
    		label.revalidate();
    		label.repaint();
    	}
     
    }
    Le programme principal, qui créé les différentes vues et les affiche :
    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
     
    public class ExempleMVC {
     
    	public static void main(String[] args) {
     
    		Model model = new Model();
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.add(createComponent(model));
    		frame.add(new Tab2(model), BorderLayout.SOUTH);
     
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	private static Component createComponent(Model model) {
    		JTabbedPane pane = new JTabbedPane();
    		pane.addTab("Tab 1", new Tab1(model));
    		pane.addTab("Tab 2", new Tab2(model));
    		return pane;
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Bonjour Joël et merci pour ta réponse.
    J'essayais de tenir réduit le nombre de classe de mon application, notamment en évitant d'implémenter une structure MVC. Ton exemple est clair. J'implémenterai donc cette structure MVC. Merci.

    Il n'empêche que j'étais curieux de découvrir comment Dinobogan résout ce genre de problème à l'aide d'une interface ...
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Chavadam Voir le message
    Il n'empêche que j'étais curieux de découvrir comment Dinobogan résout ce genre de problème à l'aide d'une interface ...
    C'est dans le principe la même chose :
    • au lieu d'injecter dans la vue un modèle, on injecte l'autre vue, mais typée par l'interface
    • au lieu d'utiliser un contrôleur et des évenements, la modification dans la vue 1 interagit directmenent à la vue2 par l'interface


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface IModelVue2 {
         void setData(...);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Vue1 {
        public Vue1(IModelVue2 vue2) {
             this.vue2=vue2;
        }
     
        ...uneMethod(...) {
               this.vue2.setData(...)
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Vue2 implements IModelVue2 {
     
        public void setData(...X) {
               swingComponent.set...X
        }
     
    }
    En revanche, ça lie fortement les vues entre elles. Et si tu as une interface riche avec pleins de vues qui doivent comporter pleins de données qui s'échangent les unes vers les autres, ça devient beaucoup plus compliqué et lourd (avec beaucoup d'instances de vues à se passer dans le constructeur des autres vues), sans parler de difficultés liées à l'accessibilité et l'existence des instances de vues.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Cher Joël,
    Compris et merci bcp.
    Je pense que tes explications et ton code-exemple seront appréciés par bien d'autres débutants également.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/04/2008, 13h59
  2. Réponses: 3
    Dernier message: 30/01/2007, 09h01
  3. Réponses: 3
    Dernier message: 12/07/2006, 16h33
  4. Réponses: 13
    Dernier message: 20/03/2006, 14h31
  5. Réponses: 6
    Dernier message: 18/01/2006, 16h26

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