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 :

Faire un menu a l'aide d'un Jtree + JtabbedPane


Sujet :

Composants Java

  1. #1
    Yro
    Yro est déconnecté
    Membre à l'essai
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Faire un menu a l'aide d'un Jtree + JtabbedPane
    Bonjour tout le monde,

    J'ai du mal a imaginer comment concevoir un menu a l'aide d'un Jtree.

    Voici ce que je veux faire :
    - Ma frame est divisé en deux parties (Avec un JSplitPane)
    - La partie gauche contient un Jtree et la partie droite un JtabbedPane
    - Dans mon Jtree, chaque nœud représente un thème (Security, Stock, Article, Statistiques, ....)
    - Dans mon Jtree, chaque feuille représente une fonctionalité géré dans un Panel exemple pour le thème Secutity: UserPanel, AccessRightPanel, ProfilPanel, ....
    - Lorsque l'on clique sur une feuille, Le programme vérifie si le Panel associé existe déjà. Si oui, il le sélectionne sinon il le crée et l'ajoute au JtabbedPane

    La où j'en suis dans ma réflexion:
    Je dois créer une classe qui dérive de DefaultMutableTreeNode pour ajouter la référence à mon Panel. Appelons le MenuTreeNode

    1ière question:
    Si je stocke dans ce MenuTreeNode le nom de la classe (ex: UserPanel.class), lors d'un clique sur ce node, comment puis créer mon panel donc le nom de la classe se trouve dans une des variables du node?
    Si je stocke une instance du UserPanel par exemple, cela m'oblige a instancier tout les Jpanels a l'ouverture, ce que je ne désire pas.

    2ième question:
    J'aimerais également mettre des icones dans ce menu pour chaque node (nœuds et feuilles), vaut-il mieux que je stocke dans mon MenuTreeNode la ressource (Chemin de l'icône) ou un objet de type ImageIcon ?


    Je vous remercie d'avance pour votre aide et vos conseils.
    N'hésitez pas a me dire si je suis complètement dans le "jus" dans mon approche
    ---==Yro==---

  2. #2
    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,

    Je stockerai plutôt une fabrique dans les MenuTreeNode. Avec le nom de la classe, tu pourrais instancier ton panel, en faisant classDePanel.newInstance() : mais ceci fonctionne dans l'hypothèse où tu n'as pas d'argument dans le constructeur. Si tu as une fabrique, tu peux avoir toutes les façons que tu veux de créer chaque onglet.

    Par exemple, dans un node, tu as un objet qui décrit Security, mettons !

    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
    public class SecurityPanelFactory extends AbstractFactory<Security> {
     
        public SecurityDescriptor() {
        } 
        publlic JPanel createPanel(Security security) {
     
              JPanel panel = new ...
     
     
              return panel;
     
        }
     
     
    }
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract AbstractPanelFactory<T extends AbstractObjectDeDonnee> {
     
        public abstract JPanel createPanel(T object);
     
    }
    Ensuite, le MenuTreeNode doit avoir une référence sur l'objet qu'il représente, et un moyen d'obtenir la fabrique correspondante (il peut la stocker dans une variable, ou appeler un composant qui connait toutes les fabriques (stockées dans une Map<AbstractObjectDeDonnee, AbstractPanelFactory<?>>).


    Pour l'icône, vaut mieux stocker l'image dans le node, plutôt que le path : ça t'évitera de charger l'image autant de fois qu'elle est présente dans l'arbre. D'ailleurs, vaut mieux toujours charger ses images à part, dans une classe qui contient toutes les ressources, plutôt que dans l'UI, ou le modèle.
    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.

  3. #3
    Yro
    Yro est déconnecté
    Membre à l'essai
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta réponse mais j'avoue ne pas du coup comprendre l'histoire de la fabrique

    C'est un peu confus et j'ai du mal a visualiser le lien entre mon exemple et le tien.

    Par contre en fouillant un peu sur le net, j'ai vu que newInstance() peut être utilisé avec des constructeurs ayant des paramétres en utilisant la classe java.lang.reflect.
    exemple: Créer un bouton (new Button("OK"));.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // Récupération de la classe java.awt.Button
          Class classe = Class.forName ("java.awt.Button");
          // Récupération du constructeur prenant en paramètre une chaîne de caractères
          java.lang.reflect.Constructor constructeur = classe.getConstructor (new Class [] {Class.forName ("java.lang.String")});
          constructeur.newInstance (new Object [] {"Ok"});
    J'avoue que je me poserai pas trop la question car mes Panels n'ont pas de paramétre dans leur constructeur. Mais c'est bon a savoir.

    Par contre j'aimerais comprendre ton histoire factory.

    J'ai réussi a faire ce que je voulais, mais je souhaiterais avoir votre avis sur la manière dont je l'ai géré. voir pièce jointe.
    ou ici:

    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
     
    public class MenuTreeDemo extends JFrame implements TreeSelectionListener {
     
    	private JTabbedPane tabbedPane;
    	private JTree tree;
     
     
    	 public static void main(String[] args) {
     
    	        javax.swing.SwingUtilities.invokeLater(new Runnable() {
    	            public void run() {
    	            	 JFrame frame = new MenuTreeDemo();
    	                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    	                 frame.pack();
    	                 frame.setVisible(true);
     
    	            }
    	        });
    	    }
     
     
    	public MenuTreeDemo() {
     
     
            MenuTreeNode top = new MenuTreeNode("MENU");
            createMenu(top);
     
     
    		JSplitPane splitPane = new JSplitPane();
    		getContentPane().add(splitPane, BorderLayout.CENTER);
     
    		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    		splitPane.setRightComponent(tabbedPane);
     
    		JScrollPane scrollPane = new JScrollPane();
    		splitPane.setLeftComponent(scrollPane);
     
    		tree = new JTree(top);
    		scrollPane.setViewportView(tree);
    		tree.addTreeSelectionListener(this);
     
    	}
     
     
    	/**
             * @param top
             */
    	private void createMenu(MenuTreeNode top) {
    		MenuTreeNode newChild;
     
    		//Sous-menu Statistique
    		MenuTreeNode statistique = new MenuTreeNode("Statistiques");
    		top.add(statistique);
    		newChild = new MenuTreeNode("Ventes","PanelStatVente");
    		statistique.add(newChild);
    		newChild = new MenuTreeNode("Retour","PanelStatRetour");
    		statistique.add(newChild);
    		newChild = new MenuTreeNode("Divers","PanelStatDivers");
    		statistique.add(newChild);
     
    		//Sous-menu Sécurité
    		MenuTreeNode Security = new MenuTreeNode("Securité");
    		top.add(Security);
    		newChild = new MenuTreeNode("Utilisateur","PanelUser");
    		Security.add(newChild);
    		newChild = new MenuTreeNode("Permmissions","PanelPermission");
    		Security.add(newChild);
    		newChild = new MenuTreeNode("Profile","PanelProfile");
    		Security.add(newChild);
     
    	}
     
    	public void valueChanged(TreeSelectionEvent arg0) {
    		MenuTreeNode node = (MenuTreeNode) tree.getLastSelectedPathComponent();
     
    		if (node == null)
    			return;
     
    		if (node.isLeaf()) {
    			JComponent panel = node.getPanelInstance();
    			int index = tabbedPane.indexOfComponent(panel);
    			if (index == -1){
    				tabbedPane.add(node.getTile(),panel);
    				index = tabbedPane.indexOfComponent(panel);
    			}
    			tabbedPane.setSelectedIndex(index);
    		}
     
    	}
    }
    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
     
    public class MenuTreeNode extends DefaultMutableTreeNode {
     
    	private String panelClassName;
    	private JComponent panelInstance;
    	private String title;
     
    	/**
             * @param title Titre du node
             * @param panelClassName Classe du panel associé 
             */
    	public MenuTreeNode(String title, String panelClassName) {
    		super(title);
    		this.title = title;
    		this.panelClassName = panelClassName;
    		this.panelInstance = null;
    	}
     
    	public MenuTreeNode(String title) {
    		super(title);
    		this.title = title;
    		this.panelClassName = null;
    		this.panelInstance = null;
    	}
     
    	public JComponent getPanelInstance(){
    		if (this.panelInstance == null && isLeaf())
    			createPanel();
    		return this.panelInstance;
    	}
     
    	private void createPanel() {
    		try {
    			this.panelInstance = (JComponent) Class.forName(panelClassName).newInstance();
    		} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public String getTile() {
    		return this.title;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class PanelPermission extends JPanel {
     
    	public PanelPermission() {	
    		JLabel lblPanelDesUtilisateurs = new JLabel("Panel des permissions");
    		add(lblPanelDesUtilisateurs);
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class PanelProfile extends JPanel {
     
    	public PanelProfile() {	
    		JLabel lblPanelDesUtilisateurs = new JLabel("Panel des profiles");
    		add(lblPanelDesUtilisateurs);
    	}
     
    }
    ....
    Merci beaucoup
    Fichiers attachés Fichiers attachés
    ---==Yro==---

  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
    Le constructeur de DefaultMutableTreeNode prend un Object en argument, appelé userObjet, qui permet d'attacher n'importe qu'elle instance à un node. C'est beaucoup plus puissant que d'y mettre juste un String avec le texte qu'on veut afficher. D'ailleurs, c'est pareil pour le nom de la classe : pourquoi utilser des String et de faire des Class.forName(), alors qu'il existe une classe Class en Java ?

    Faire/Utiliser des classes pour représenter les objets du modèle de données permet beaucoup de souplesse (et c'est un peu le but des LOO que de faire des objets).

    Mais tu peux y mettre aussi directement la fabrique associée au nœud.

    Pour le détail de la mon "histoire de fabrique", j'ai pas trop le temps de rentrer dans des explications pour le moment. Je t'invite à regarder les tuto sur les Design Pattern, comme : Design Patterns du Gang of Four appliqués à Java. Et je viendrais approfondir si nécessaire plus tard.
    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
    Yro
    Yro est déconnecté
    Membre à l'essai
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Voila, j'ai quelques peu modifié.
    - Gestion des icones
    - Gestion des tooltip
    - Suppression de la classe MenuTreeNode (Devenu inutile)
    - Nouvelle classe MenuItem qui contient toutes les infos nécessaires et est objet du DefaultMutableTreeNode.

    Je vais essayer de comprendre le factory Pattern mais je ne vois pas bien ou cela me serait utile dans ce cas.


    prochaine étape la gestion de la fermeture des onglet. Ajout d'un bouton fermer sur les onglets et libération de la mémoire au niveau du panelInstance contenu dans mes MenuItem.



    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
     
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
     
    public class MenuItem {
     
    	private String title;
    	private String tooltip;
    	private Class panelClass;
    	private JComponent panelInstance;
    	private ImageIcon icon;
     
    	public MenuItem(String title, Class panelClass, ImageIcon icon, String tooltip) {
    		this.title = title;
    		this.tooltip = tooltip;
    		this.panelClass = panelClass;
    		this.icon = icon;
    	}
     
    	public String toString(){
    		return this.title;
    	}
     
    	public JComponent getPanelInstance() {
    		if (panelInstance == null)
    			createPanel();
    		return panelInstance;
    	}
     
    	public String getTitle() {
    		return this.title;
    	}
     
    	public ImageIcon getIcon() {
    		return icon;
    	}
     
    	public String getTooltip() {
    		return this.tooltip;
    	}
     
    	private void createPanel() {
    		try {
    			this.panelInstance = (JComponent) panelClass.newInstance();
    		} catch (InstantiationException | IllegalAccessException e) {
    			e.printStackTrace();
    		}
    	}
     
     
     
    }
    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
    import java.awt.Component;
     
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
     
     
    public class MenuTreeCellRenderer extends DefaultTreeCellRenderer {
     
    	public MenuTreeCellRenderer() {
     
    	}
     
    	public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
     
    		super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
    		if (leaf) {
    			MenuItem menuItem = (MenuItem) ((DefaultMutableTreeNode)value).getUserObject();
    			setIcon(menuItem.getIcon());
    			setToolTipText(menuItem.getTooltip());
    		} else {
    			setToolTipText(null); // no tool tip
    		}
     
    		return this;
    	}
     
    }

    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
     
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JTree;
    import javax.swing.ToolTipManager;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.JSplitPane;
     
    import java.awt.BorderLayout;
     
    import javax.swing.JTabbedPane;
    import javax.swing.JScrollPane;
     
     
     
    public class MenuTreeDemo extends JFrame implements TreeSelectionListener {
     
    	private JTabbedPane tabbedPane;
    	private JTree tree;
     
    	public static void main(String[] args) {
     
    		javax.swing.SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				JFrame frame = new MenuTreeDemo();
    				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    				frame.pack();
    				frame.setVisible(true);
    			}
    		});
    	}
     
    	public MenuTreeDemo() {
     
    		DefaultMutableTreeNode top = new DefaultMutableTreeNode("MENU");
    		createMenu(top);
     
    		JSplitPane splitPane = new JSplitPane();
    		getContentPane().add(splitPane, BorderLayout.CENTER);
     
    		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    		splitPane.setRightComponent(tabbedPane);
     
    		JScrollPane scrollPane = new JScrollPane();
    		splitPane.setLeftComponent(scrollPane);
     
    		tree = new JTree(top);
    		scrollPane.setViewportView(tree);
    		tree.addTreeSelectionListener(this);
     
    		ToolTipManager.sharedInstance().registerComponent(tree);
    		tree.setCellRenderer(new MenuTreeCellRenderer());
     
     
    	}
     
    	/**
             * @param top
             */
    	private void createMenu(DefaultMutableTreeNode top) {
    		DefaultMutableTreeNode newChild;
    		MenuItem menuItem;
     
    		// Sous-menu Statistique
    		DefaultMutableTreeNode statistique = new DefaultMutableTreeNode("Statistiques");
    		top.add(statistique);
     
    		ImageIcon ico1 = new ImageIcon(MenuTreeDemo.class.getResource("/1_32.png"));
    		menuItem = new MenuItem("Ventes",PanelStatVente.class,ico1,"Statistiques des ventes");
    		newChild = new DefaultMutableTreeNode(menuItem);
    		statistique.add(newChild);
     
    		ImageIcon ico2 = new ImageIcon(MenuTreeDemo.class.getResource("/2_32.png"));
    		menuItem = new MenuItem("Retour",PanelStatRetour.class,ico2,"Statistiques des retours");
    		newChild = new DefaultMutableTreeNode(menuItem);
    		statistique.add(newChild);
     
    		menuItem = new MenuItem("Divers",PanelStatDivers.class,ico2,"Statistiques diverses");
    		newChild = new DefaultMutableTreeNode(menuItem);
    		statistique.add(newChild);
     
    		// Sous-menu Sécurité
    		DefaultMutableTreeNode Security = new DefaultMutableTreeNode("Securité");
    		top.add(Security);
     
    		menuItem = new MenuItem("Utilisateur",PanelUser.class,null,"");
    		newChild = new DefaultMutableTreeNode(menuItem);
    		Security.add(newChild);
     
    		menuItem = new MenuItem("Permmissions",PanelPermission.class,null,"");
    		newChild = new DefaultMutableTreeNode(menuItem);
    		Security.add(newChild);
     
    		menuItem = new MenuItem("Profile",PanelProfile.class,null,"");
    		newChild = new DefaultMutableTreeNode(menuItem);
    		Security.add(newChild);
     
    	}
     
    	public void valueChanged(TreeSelectionEvent arg0) {
    		DefaultMutableTreeNode node =  (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
     
    		Object nodeInfo = node.getUserObject();
     
    		if (node == null)
    			return;
     
    		if (node.isLeaf()) {
    			MenuItem menuItem = (MenuItem) nodeInfo;
     
    			JComponent panel = menuItem.getPanelInstance();
    			int index = tabbedPane.indexOfComponent(panel);
    			if (index == -1) {
    				tabbedPane.add(menuItem.getTitle(), panel);
    				index = tabbedPane.indexOfComponent(panel);
    			}
    			tabbedPane.setSelectedIndex(index);
    		}
     
    	}
    }
    ---==Yro==---

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

Discussions similaires

  1. aide pour fair un menu sou form
    Par seifdev dans le forum Forms
    Réponses: 0
    Dernier message: 21/07/2009, 19h52
  2. [CONTEXT_FILETXT] Est-ce bien pour faire un menu contextuel
    Par Furius dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 18/11/2005, 21h31
  3. 2 problemes pour faire un menu en CSS
    Par Death83 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 12/08/2005, 08h23
  4. [menu]faire un menu déroulant
    Par Nadine dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/03/2005, 08h33
  5. Faire disparaître menu lors de l'impression
    Par jackrabbit dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 19/12/2004, 20h56

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