CardLayout

با استفاده از CardLayout شما می‌توانید چندین کنترل را در یک فضا نمایش دهید. برای درک بهتر برگه‌های پاسور را در نظر بگیرید که همه روی هم قراردارند و در لحظه فقط یکی از آنها قابل مشاهده است یا تب‌های مرورگرتان را در نظر بگیرید. زمانی که شما یکی از تب‌ها کلیک می‌کنید محتوای پنجره تغییر می‌کند، در حقیقت تمامی محتویات یک تب قبلاً بارگذاری شده و در بالای یکدیگر قرار گرفته‌اند. زمانی که شما روی یکی از تب‌ها کلیک می‌کند فقط یکی از آنها نمایش داده می‌شود و مابقی تب‌ها غیرقابل مشاهده می‌شوند. کتابخانه Swing شامل کنترل‌های آماده برای پنجره‌های همراه با تب‌ها بنام JTabbedPane می‌باشد. برای درک بهتر عملکرد این کلاس به کد زیر توجه کنید :

   1: import java.awt.*;
   2: import java.awt.event.*;
   3: import javax.swing.*;
   4:  
   5: public class CardLayoutExample 
   6: {
   7:     public static void main(String[] arguments) 
   8:     {
   9:         // main window
  10:         JFrame Frame1 = new JFrame("CardLayout Example");
  11:         Frame1.setSize(430,315); 
  12:   
  13:         final CardLayout cardLayout = new CardLayout(); 
  14:         final JPanel cardPanel = new JPanel(cardLayout);
  15: 
  16:         // create two dummy panels (the "cards") to show
  17:         JPanel card1 = new JPanel();
  18:         card1.setBackground(Color.red);
  19:  
  20:         JPanel card2 = new JPanel();
  21:         card2.setBackground(Color.blue);
  22: 
  23:         cardPanel.add(card1,"RedCard");
  24:         cardPanel.add(card2,"BlueCard");
  25: 
  26:         // create two buttons 
  27:         JPanel buttonPanel = new JPanel();
  28:         JButton b1 = new JButton("Red");
  29:         JButton b2 = new JButton("Blue");
  30:         buttonPanel.add(b1);
  31:         buttonPanel.add(b2);
  32: 
  33:         Frame1.add(cardPanel,BorderLayout.CENTER);
  34:         Frame1.add(buttonPanel,BorderLayout.SOUTH);
  35:  
  36:         // create action listeners for buttons
  37:         b1.addActionListener(new ActionListener() 
  38:         {
  39:             public void actionPerformed(ActionEvent event) 
  40:             {
  41:                 cardLayout.show(cardPanel, "RedCard");
  42:             }
  43:         });
  44:  
  45:         b2.addActionListener(new ActionListener() 
  46:         {
  47:             public void actionPerformed(ActionEvent event) 
  48:             {
  49:                 cardLayout.show(cardPanel, "BlueCard");
  50:             }
  51:         });
  52:  
  53:         // Show main Frame1
  54:         Frame1.setVisible(true);
  55:     }
  56: }

هدف کلی کد بالا این است که با با کلیک بر روی دو دکمه دو کارت با رنگ‌های قرمز و آبی که بر روی هم قرار دارند را نمایان کنیم. یا فرض کنید که این دو دکمه حکم تب دارند. ابتدا یک کلاس در در خطوط 56-5 تعریف کرده‌ایم. سپس در داخل متد main و در خطوط 10 و 11 یک Frame ایجاد می‌کنیم. در خط 13 یک نمونه از کلاس CardLayout ایجاد و آن را در خط 14 به یک Panel وصل می‌کنیم. این پنل همان پنلی است که کارت‌های قرمز و آبی در آن قرار می‌گیرند. برای ایجاد این دو کارت دو پنل 21-17 ایجاد کرده و آنها را به پنل اصلی یعنی cardPanel در خط 23 و 24 اضافه می‌کنیم. به پارامتر دوم متد ()add در این دو خط توجه کنید. این پارامترها نام‌هایی هستند که ما به این دو کارت اختصاص داده‌ایم. حال نوبت به اضافه کردن دو دکمه می‌رسد. در خط 27 یک Panel دیگر ایجاد کرده و دو دکمه به نام‌های Red و Blue به این پنل اضافه می‌کنیم (خطوط 31-28).

حال نوبت به اضافه کردن دو پنل که یکی از آنها حاوی کارت‌ها و دیگری حاوی دکمه‌ها است به Frame می‌رسد. این دو پنل را در خطوط 34 و 35 به فریم اضافه می‌کنیم. چون layout manager فریم به صورت پیشفرض BorderLayout است می‌توانیم یکی از پنل ها را در وسط و دیگری را در پایین فریم قرار دهیم. در خطوط 51-37 هم دو کنترل کننده رویداد برای دو دکمه ایجاد می‌کنیم تا با کلیک بر روی دکمه‌ها کارت مربوط به آن نمایش داده شود. در خطوط 41 و 49 هم با استفاده از متد ()show کلاس CardLayout دو کارت را نمایش می‌دهیم. حال برنامه را اجرا و با کلیک بر روی دو دکمه نتیجه را مشاهده نمایید :
cardlayout-in-swing-01

cardlayout-in-swing-02