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

布局管理器之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()方法翻转到指定名称的卡片。

完整示例代码:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 测试卡片布局管理器
 * 
 * @author 小明
 *
 */
public class CardLayoutDemo extends JFrame implements ActionListener {

    private static final long serialVersionUID = 4896546345039691L;
    // 卡片布局管理器
    private CardLayout cardLayout;
    // 使用卡片布局管理器的面板
    private JPanel cardPnl;

    public CardLayoutDemo() {
        setTitle("布局管理器之CardLayout");
        setSize(500, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        /* 创建两个按钮,添加到窗体底部,默认窗体布局采用BorderLayout */
        JPanel btn = new JPanel(); // 面板默认布局使用FlowLayout
        JButton next = new JButton("next");
        JButton previous = new JButton("previous");
        btn.add(previous);
        btn.add(next);
        next.addActionListener(this); // 注册按钮事件监听器
        previous.addActionListener(this); // 注册按钮事件监听器
        this.add(btn, BorderLayout.SOUTH);

        /* 创建使用CardLayout布局管理器的容器 */
        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);
        }
        // 将使用了CardLayout的面板添加到窗体中显示
        this.add(cardPnl, BorderLayout.CENTER);

        setVisible(true);
    }

    /**
     * 处理按钮点击事件
     */
    @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); // 切换上一个选项卡
    }

    public static void main(String[] args) {
        new CardLayoutDemo();
    }
}

运行效果:

CardLayout

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值