布局管理器之CardLayout(卡片布局管理器)


對於選項卡這個概念大家可能不會陌生,就是在一個窗口中可以切換顯示多頁不同的內容,但同一時間只能是其中的某一頁可見的,這樣的一個個的頁面就是選項卡。

CardLayout就是類似的這樣一個布局管理器,它能夠讓多個組件共享同一個顯示空間,共享空間的組件之間的關系就像重疊在一起的一幅撲克牌,組件重疊在一起,初始時顯示該空間中第一個組件,通過CardLayout類提供的方法可以切換該空間中顯示的組件。

下面我們來看一個例子,實現CardLayout布局管理器的使用。

創建一個使用CardLayout布局的面板:

// 卡片布局管理器 private CardLayout cardLayout; // 使用卡片布局管理器的面板 private JPanel cardPnl; cardLayout = new CardLayout(); cardPnl = new JPanel(cardLayout); 

向面板中添加幾張圖片,因為面板使用卡片布局,所以所添加的圖片是重疊在一起的:

/* 向面板中添加幾張圖片 */ for (int i = 0; i < 8; i++) { final int j = i + 1; // 將圖片繪制到面板中 JPanel img = new JPanel() { private static final long serialVersionUID = 1L; @Override protected void paintComponent(Graphics g) { g.drawImage( Toolkit.getDefaultToolkit().getImage( "images/Freedom" + j + ".gif"), 0, 0, null); } }; // 將圖片面板添加到使用了CardLayout的容器面板中 cardPnl.add("Freedom" + j, img); } 

添加兩個按鈕,用於顯示上一張圖片與下一張圖片,並為按鈕注冊事件監聽器,處理事件的方法:

/** * 處理按鈕點擊事件 */ @Override public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); // 獲取是何種操作 if ("next".equals(cmd)) // 顯示下一張圖片 cardLayout.next(cardPnl); // 切換下一個選項卡 else if ("previous".equals(cmd)) // 顯示上一張圖片 cardLayout.previous(cardPnl); // 切換上一個選項卡 } 

我們可以通過調用CardLayout的next()方法翻轉到指定容器的下一張卡片,如果當前的可見卡片是最后一個,則翻轉到布局的第一張卡片。同樣,也可以使用previout()方法翻轉到指定容器的前一張卡片。除了這兩個方法外,還有last()、first()方法可以翻轉到最后一張、第一張卡片,我們也可以直接使用show()方法翻轉到指定名稱的卡片。

完整示例代碼:

  1 package cardLayout;
  2 
  3 import java.awt.BorderLayout;
  4 import java.awt.CardLayout;
  5 import java.awt.Graphics;
  6 import java.awt.Toolkit;
  7 import java.awt.event.ActionEvent;
  8 import java.awt.event.ActionListener;
  9 
 10 import javax.swing.JButton;
 11 import javax.swing.JFrame;
 12 import javax.swing.JPanel;
 13 import javax.swing.JTextField;
 14 
 15 /**
 16  * 測試卡片布局管理器 如果插入圖片的名字不相同的話,就要用多個面板去繪制,因為一個面板只裝一張圖。名字相同就可以用循環。
 17  * 
 18  * @author hellokitty燕
 19  *
 20  */
 21 public class CardLayoutDemo2 extends JFrame implements ActionListener {
 22 
 23     private static final long serialVersionUID = 1L;
 24 
 25     private CardLayout cardLayout;// 卡片布局管理器
 26     private JPanel jPanel;// 使用卡片布局管理器的面板
 27     private JTextField jTextField;// 用於你輸入的跳轉頁面
 28 
 29     public CardLayoutDemo2() {
 30 
 31         setTitle("布局管理器之CardLayout");
 32         setSize(600, 600);
 33         setDefaultCloseOperation(EXIT_ON_CLOSE);
 34         setLocationRelativeTo(null);
 35 
 36         /* 創建兩個按鈕,添加到窗體底部,默認窗體布局采用BorderLayout */
 37         JPanel jp = new JPanel();// 面板默認布局使用FlowLayout
 38 
 39         JButton up = new JButton("上一張");
 40         JButton next = new JButton("下一張");
 41         jTextField = new JTextField("2");
 42         JButton go = new JButton("go");
 43 
 44         jp.add(up);
 45         jp.add(next);
 46         jp.add(jTextField);
 47         jp.add(go);
 48         // 注冊按鈕監聽事件
 49 
 50         up.addActionListener(this);
 51         next.addActionListener(this);
 52         go.addActionListener(this);
 53         this.add(jp, BorderLayout.SOUTH);
 54 
 55         /* 創建使用CardLayout布局管理器的容器 */
 56         cardLayout = new CardLayout();
 57         jPanel = new JPanel(cardLayout);
 58 
 59         /* 向面板中添加幾張圖片 */
 60 
 61         // 將圖片繪制到面板中 /
 62         JPanel images = new JPanel() {
 63             private static final long serialVersionUID = 1L;
 64 
 65             @Override
 66             protected void paintComponent(Graphics g) {
 67                 super.paintComponent(g);
 68                 g.drawImage(
 69                         Toolkit.getDefaultToolkit().getImage(
 70                                 "src/images/sprite.png"), 200, 100, this);
 71 
 72             }
 73 
 74         };
 75         // 將圖片面板添加到使用了cardLayout容器面板中
 76 
 77         jPanel.add("sprite", images);
 78 
 79         JPanel img = new JPanel() {
 80 
 81             private static final long serialVersionUID = 1L;
 82 
 83             @Override
 84             protected void paintComponent(Graphics g) {
 85                 super.paintComponent(g);
 86                 g.drawImage(
 87                         Toolkit.getDefaultToolkit().getImage(
 88                                 "src/images/Freedom1.gif"), 200, 100, this);
 89             }
 90 
 91         };
 92 
 93         jPanel.add("Freedom1", img);
 94 
 95         JPanel im = new JPanel() {
 96 
 97             private static final long serialVersionUID = 1L;
 98 
 99             @Override
100             protected void paintComponent(Graphics g) {
101                 super.paintComponent(g);
102                 g.drawImage(
103                         Toolkit.getDefaultToolkit().getImage(
104                                 "src/images/sprite1.png"), 200, 100, this);
105             }
106 
107         };
108         jPanel.add("sprite1", im);
109 
110         // 將使用了CardLayout的面板添加到窗體中顯示
111         this.add(jPanel, BorderLayout.CENTER);
112 
113         setVisible(true);
114 
115     }
116 
117     @Override
118     public void actionPerformed(ActionEvent e) {
119         String cmd = e.getActionCommand();
120         if ("下一張".equals(cmd)) {
121             cardLayout.next(jPanel); // 切換下一個選項卡
122         } else if ("上一張".equals(cmd)) {
123             cardLayout.previous(jPanel);// 切換上一個選項卡
124         } else if ("go".equals(cmd)) {
125             cardLayout.show(jPanel, "Freedom" + jTextField.getText());//這個主要是用於名字相似的圖片,如果你想跳轉的圖片名字不一樣的話,你就可以去把圖片的名字改成相似的。
126         }
127 
128     }
129 
130     public static void main(String[] args) {
131         new CardLayoutDemo2();
132     }
133 }

運行效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM