当前位置:首页 > 文章列表 > 文章 > java教程 > Java CardLayout 怎样按名称切换容器中的卡片

Java CardLayout 怎样按名称切换容器中的卡片

来源:17golang原创 2026-10-31 10:19:58 0浏览 收藏

Java Swing 里要在同一个区域放入多个面板,并根据菜单或按钮显示其中一个,CardLayout 的关键不是给组件设置显示状态,而是给每个组件绑定一个字符串名称,再让同一个布局对象调用 show(parent, name)。名称完全匹配时切换到对应卡片;名称不存在时不会抛出“找不到卡片”的异常,而是什么也不改变。

官方地址:https://docs.oracle.com/en/java/javase/25/docs/api/java.desktop/java/awt/CardLayout.html

把 CardLayout 保存成一个变量,把卡片容器作为 show 的第一个参数,并在添加组件时使用同一套名称常量,就能按名称切换。首个加入容器的组件默认是初次显示的卡片。

名称绑定在添加卡片时完成

CardLayout 把容器里的每个组件当作一张卡片。名称不是 JPanel 的 setName 属性,而是添加组件时传给布局管理器的字符串约束。推荐直接使用 add(component, constraint) 的形式:

CardLayout layout = new CardLayout();
JPanel cards = new JPanel(layout);

JPanel overview = new JPanel();
JPanel details = new JPanel();

// 第二个参数是 CardLayout 用来定位卡片的字符串键
cards.add(overview, "overview");
cards.add(details, "details");

// show 的第一个参数必须是承载这些卡片的同一个容器
layout.show(cards, "details");

这里的 "overview" 和 "details" 会进入 CardLayout 的名称表。Oracle API 说明,约束对象必须是字符串;如果传入其他类型,会触发 IllegalArgumentException。因此名称应当当作组件注册契约来维护,而不是临时拼接。

CardLayout 中容器、名称约束和卡片面板的静态关系说明图
图1:结构说明图,展示名称约束如何把同一个卡片容器连接到多个面板。

用同一个布局对象按名称切换

实际界面通常把导航按钮放在卡片容器外面。事件监听器只需要调用布局对象的 show 方法;不要在每次点击时新建一个 CardLayout,否则新对象并不知道原容器登记过哪些卡片。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

JFrame frame = new JFrame("CardLayout 示例");
CardLayout layout = new CardLayout();
JPanel cards = new JPanel(layout);

JPanel home = new JPanel();
home.add(new JLabel("首页卡片"));
JPanel settings = new JPanel();
settings.add(new JLabel("设置卡片"));

// 名称建议集中成常量,避免按钮和注册处出现拼写漂移
final String HOME = "home";
final String SETTINGS = "settings";
cards.add(home, HOME);
cards.add(settings, SETTINGS);

JButton openSettings = new JButton("打开设置");
openSettings.addActionListener(event -> {
    // 事件发生时切换同一个 cards 容器中的命名卡片
    layout.show(cards, SETTINGS);
});

JButton openHome = new JButton("返回首页");
openHome.addActionListener(event -> {
    // 返回动作仍然使用同一个布局实例和父容器
    layout.show(cards, HOME);
});

JPanel navigation = new JPanel();
navigation.add(openHome);
navigation.add(openSettings);
frame.add(navigation, BorderLayout.NORTH);
frame.add(cards, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);

这个写法把“卡片注册”和“按钮导航”分开:注册阶段决定名称,事件阶段只消费名称。show 会翻到使用该名称添加的组件;如果没有对应组件,API 的行为是“不做任何事情”,所以界面不变化并不一定是 Swing 绘制失败。

CardLayout 的 show 方法、名称键和当前可见卡片之间的静态关系说明图
图2:关系说明图,展示同一个布局实例如何依据名称关联目标卡片和父容器。

初始卡片、名称错误和顺序方法

初次显示时,最先加入 CardLayout 的组件是可见卡片。若希望启动后显示设置页,可以调整添加顺序,或在界面完成组装后显式调用 layout.show(cards, SETTINGS)。显式调用更容易表达启动状态,但仍然要保证名称已经完成注册。

常见的“不切换”原因有三个:

  • 添加时使用了 "setting",点击时却传入 "settings";名称是精确匹配,不会自动纠正。
  • 调用 show 时传入的不是承载卡片的父容器,或者布局对象不是注册卡片时的那个实例。
  • 把名称写成动态字符串后没有统一管理,导致按钮和注册处的空格、大小写或拼写出现差异。

如果需求只是“下一张/上一张”而不关心具体业务名称,可以使用 next(parent) 和 previous(parent);前者到达末尾后会回到第一张,后者到达第一张后会回到最后一张。需要明确打开某个功能页时,仍应优先使用 show。

一张表记住 CardLayout 的切换规则

需求调用方式注意点
按业务名称打开卡片show(parent, name)名称必须在添加组件时以字符串约束登记
显示第一张或最后一张first(parent) / last(parent)顺序由容器内部组件顺序决定
按顺序翻页next(parent) / previous(parent)到边界时会循环

可以把名称常量、卡片容器和布局对象放在同一个界面控制器中,按钮只引用常量。这样做的价值不在于代码更短,而是把“卡片存在”和“导航目标”放进同一份可维护契约里。

相关问题

CardLayout 能同时显示两张卡片吗?

它的设计是同一容器一次显示一张卡片。如果需要并排区域,应拆成多个容器,分别使用布局管理器。

名称不存在时应该捕获什么异常?

show 对不存在的名称不会抛出专门异常,而是保持当前显示状态。应用层若要求导航一定成功,可以在注册时维护名称集合,再在调用前自行判断。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go llrb 怎样删除有序树中的最小元素Go llrb 怎样删除有序树中的最小元素
上一篇
Go llrb 怎样删除有序树中的最小元素
Python tabnanny 怎样定位缩进中混用制表符的问题
下一篇
Python tabnanny 怎样定位缩进中混用制表符的问题
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    809次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    798次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    890次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    861次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    687次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码