对于选项卡这个概念大家可能不会陌生,就是在一个窗口中可以切换显示多页不同的内容,但同一时间只能是其中的某一页可见的,这样的一个个的页面就是选项卡。

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()方法翻转到指定名称的卡片。

完整示例代码:

 package cardLayout;

 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;
import javax.swing.JTextField; /**
* 测试卡片布局管理器 如果插入图片的名字不相同的话,就要用多个面板去绘制,因为一个面板只装一张图。名字相同就可以用循环。
*
* @author hellokitty燕
*
*/
public class CardLayoutDemo2 extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private CardLayout cardLayout;// 卡片布局管理器
private JPanel jPanel;// 使用卡片布局管理器的面板
private JTextField jTextField;// 用于你输入的跳转页面 public CardLayoutDemo2() { setTitle("布局管理器之CardLayout");
setSize(600, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null); /* 创建两个按钮,添加到窗体底部,默认窗体布局采用BorderLayout */
JPanel jp = new JPanel();// 面板默认布局使用FlowLayout JButton up = new JButton("上一张");
JButton next = new JButton("下一张");
jTextField = new JTextField("2");
JButton go = new JButton("go"); jp.add(up);
jp.add(next);
jp.add(jTextField);
jp.add(go);
// 注册按钮监听事件 up.addActionListener(this);
next.addActionListener(this);
go.addActionListener(this);
this.add(jp, BorderLayout.SOUTH); /* 创建使用CardLayout布局管理器的容器 */
cardLayout = new CardLayout();
jPanel = new JPanel(cardLayout); /* 向面板中添加几张图片 */ // 将图片绘制到面板中 /
JPanel images = new JPanel() {
private static final long serialVersionUID = 1L; @Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(
Toolkit.getDefaultToolkit().getImage(
"src/images/sprite.png"), 200, 100, this); } };
// 将图片面板添加到使用了cardLayout容器面板中 jPanel.add("sprite", images); JPanel img = new JPanel() { private static final long serialVersionUID = 1L; @Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(
Toolkit.getDefaultToolkit().getImage(
"src/images/Freedom1.gif"), 200, 100, this);
} }; jPanel.add("Freedom1", img); JPanel im = new JPanel() { private static final long serialVersionUID = 1L; @Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(
Toolkit.getDefaultToolkit().getImage(
"src/images/sprite1.png"), 200, 100, this);
} };
jPanel.add("sprite1", im); // 将使用了CardLayout的面板添加到窗体中显示
this.add(jPanel, BorderLayout.CENTER); setVisible(true); } @Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if ("下一张".equals(cmd)) {
cardLayout.next(jPanel); // 切换下一个选项卡
} else if ("上一张".equals(cmd)) {
cardLayout.previous(jPanel);// 切换上一个选项卡
} else if ("go".equals(cmd)) {
cardLayout.show(jPanel, "Freedom" + jTextField.getText());//这个主要是用于名字相似的图片,如果你想跳转的图片名字不一样的话,你就可以去把图片的名字改成相似的。
} } public static void main(String[] args) {
new CardLayoutDemo2();
}
}

运行效果:

布局管理器之CardLayout(卡片布局管理器)的更多相关文章

  1. 三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)

    摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...

  2. 转:三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)

    转:http://blog.csdn.net/liujun13579/article/details/7773945 卡片布局能够让多个组件共享同一个显示空间,共享空间的组件之间的关系就像一叠牌,组件 ...

  3. Java图形化界面设计——布局管理器之CardLayout(卡片布局)

  4. java 图形化小工具Abstract Window Toolit ;布局管理器FlowLayout流式布局;BorderLayout边界布局;GridLayout网格布局;CardLayou重叠卡片布局;BoxLayout方框布局;绝对定位

    1.FlowLayout流式布局管理器: FlowLayout布局管理器中,组件像水流一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列 .在默认情况下,FlowLayout局管理器从左向 ...

  5. Java基础之创建窗口——使用卡片布局管理器(TryCardLayout)

    控制台程序. 卡片布局管理器会生成一叠组件——一个组件放在另一个组件的上面.添加到容器中的第一个组件在堆栈的顶部,因此是可见的,添加的最后一个组件在堆栈的底部.使用默认的构造函数CardLayout( ...

  6. 转:Java图形化界面设计——布局管理器之FlowLayout(流式布局)其他请参考转载出处网址

    http://blog.csdn.net/liujun13579/article/details/7771191 前文讲解了JFrame.JPanel,其中已经涉及到了空布局的使用.Java虽然可以以 ...

  7. Java图形化界面设计——布局管理器之FlowLayout(流式布局)

    一.布局管理器所属类包 所属类包 布局管理器名称 说明 Java.awt FlowLayout(流式布局) 组件按照加入的先后顺序按照设置的对齐方式从左向右排列,一行排满到下一行开始继续排列 Bord ...

  8. 03 Java图形化界面设计——布局管理器之FlowLayout(流式布局)

    前文讲解了JFrame.JPanel,其中已经涉及到了空布局的使用.Java 虽然可以以像素为单位对组件进行精确的定位,但是其在不同的系统中将会有一定的显示差异,使得显示效果不尽相同,为此java提供 ...

  9. Swing-布局管理器之GridLayout(网格布局)-入门

    注:本文内容源自于三十一.Java图形化界面设计——布局管理器之GridLayout(网格布局),笔者在学习过程中根据自身理解修改了部分代码. 网格布局特点: l  使容器中的各组件呈M行×N列的网格 ...

随机推荐

  1. Swiper使用方法(向前和向后按钮在swiper-container外面)

    Swiper插件的使用 1.HTML <!-- Swiper --> <section class="swipper"> <div class=&qu ...

  2. linux系统编程之文件与IO(五):stat()系统调用获取文件信息

    一.stat()获取文件元数据 stat系统调用原型: #include <sys/stat.h> int stat(const char *path, struct stat *buf) ...

  3. JAVA 从头开始<六>

    一.静态代码块 静态代码块不需要创建对象才执行,比对象数据优先存在于内存中 二.静态函数 三.单例设计模式 1.饿汉单例模式 缺点:一声明就创建一个对象,没有使用的话就浪费了. 2.懒汉单例模式 1. ...

  4. 标准 OpenStack 多region配置

    首先搭建两套一样的OpenStack环境 更改前: node1: 192.168.200.100 RegionOne node2: 192.168.200.200 RegionOne 预期结果: no ...

  5. hashlib(摘要算法的模块)--重要 (一)

    课件地址:https://www.cnblogs.com/mys6/p/10584933.html  搜索hashlib模块 # 登录认证# 加密 --> 解密# 摘要算法# 两个字符串 :# ...

  6. BZOJ 4517--[Sdoi2016]排列计数(乘法逆元)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1727  Solved: 1067 Description ...

  7. Python(文件上传)

    day26 通过socket上传文件. post_client.py import socket import os sk = socket.socket() print(sk) address = ...

  8. 一,php的错误处理和异常处理

    php程序中如果语法或逻辑错误,会引起php默认错误处理机制,不会引起异常处理机制,只有在程序中throw抛出异常后,如果没有catch捕捉异常,默认调用php默认异常处理. php有默认错误机制和默 ...

  9. 带你走进php大马的结构模块编写之路

    本文原创作者:Laimooc 第一部分:前沿综述 本次我主要写了[文件的创建].[文件的删除].[文件的上传].[目录浏览].[命令执行]小模块,以及[组合的目录浏览和文件删除功能]的模块: 实验环境 ...

  10. 近期js

    1 var value1 = 0, value2 = 0, value3 = 0; for ( var i = 1; i <= 3; i++) { var i2 = i; (function() ...