package demo; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; public class DemoCardLayout { private static final String PANEL_DEFAULT_ID = "default"; private static final String PANEL_1_ID = "1"; private static final String PANEL_2_ID = "2"; public static void main(String[] args) { new DemoCardLayout().run(); } public DemoCardLayout() { } public void run() { // on créé une fenêtre JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new BorderLayout()); // on créé un panel principal dans lequel on aura trois panels dont 1 seul est affiché à la fois // le panel principal = le panel avec CardLayout JPanel mainPanel = new JPanel(); CardLayout cardLayout = new CardLayout(); mainPanel.setLayout(cardLayout); // on créé les trois (sous-) panels JPanel defaultPanel = new JPanel(); JPanel panel1 = createPanel("PANEL 1", Color.CYAN); JPanel panel2 = createPanel("PANEL 2", Color.ORANGE); // on ajoute les 3 panels, en associant à chacun d'eux un identifiant unique dans le panel principal mainPanel.add(defaultPanel, PANEL_DEFAULT_ID); // le premier panel ajouté sera affiché par défaut mainPanel.add(panel1, PANEL_1_ID); mainPanel.add(panel2, PANEL_2_ID); // on ajoute le panel principal au content pane de la fenêtre frame.getContentPane().add(mainPanel); // on crée un unique menu qui aura un item pour afficher chaque panel JMenuBar menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); JMenu menu = new JMenu("Affichage"); menuBar.add(menu); // les menu item pour afficher chaque panel createMenu(menu, new CardLayoutPanelSelector(mainPanel,cardLayout, PANEL_1_ID), "Afficher panel 1") ; createMenu(menu, new CardLayoutPanelSelector(mainPanel,cardLayout, PANEL_2_ID), "Afficher panel 2") ; createMenu(menu, new CardLayoutPanelSelector(mainPanel,cardLayout, PANEL_DEFAULT_ID), "Revenir à l'état initial") ; // on affiche la fenêtre //frame.setSize(Toolkit.getDefaultToolkit().getScreenSize()); frame.setSize(200,200); frame.setLocationRelativeTo(null); frame.setVisible(true); } private void createMenu(JMenu menu, CardLayoutPanelSelector cardLayoutPanelSelector, String menuLabel) { JMenuItem menuItem = new JMenuItem(menuLabel); menu.add(menuItem); menuItem.addActionListener( cardLayoutPanelSelector ); } private JPanel createPanel(String name, Color bg) { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(new JLabel(name, JLabel.CENTER), BorderLayout.CENTER); // on affiche le nom du panel en son centre panel.setBackground(bg); return panel; } /** * Une classe pour gérer l'affichage d'un panel sur action */ private class CardLayoutPanelSelector implements ActionListener { private Container parent; private CardLayout cardLayout; private String panelId; /** * * @param parent le container qui contient les panels à afficher * @param cardLayout le composant de layout * @param panelId l'identifiant du panel à afficher quand l'action est déclenchée */ public CardLayoutPanelSelector(Container parent, CardLayout cardLayout, String panelId) { this.parent=parent; this.cardLayout=cardLayout; this.panelId=panelId; } @Override public void actionPerformed(ActionEvent e) { cardLayout.show(parent, panelId); // on demande l'affichage du panel d'identifiant panelId dans le CardLayout } } }