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
   | 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
		}
 
	}
 
} | 
Partager