`

布局管理器(一)——CardLayout

阅读更多

     CardLayout布局管理器允许向一个容器中添加多个组件,允许在同一位置添加并显示所有组件。不过任意时刻只有一个组件是可见的,通过调用 CardLayout中定义的first()、last()、next()和previous()方法指定显示哪个组件,显示顺序正如这些方法名一样。另 外还有show()方法用于指定显示某个组件,这时将不考虑容器中该组件与其他组件的关系。

      CardLayout类可以说是Java中作用最小的布局管理器,用这个管理器,可以使得容器象一个卡片盒,而容器中的页面象卡片盒中的卡片一样任意翻动 显示。引入Swing之前,CardLayout用于创建选项卡用户界面,但Swing中的JTabbedPane提供了更好的实现机制,不过某些情况还 是会用到CardLayout,如制作Windows 风格的用户向导界面来依次显示一系列面板。

CardLayout布局管理器有以下构造函数:
CardLayout():创建一卡片布局管理器
CardLayout(int hgap, int vgap):创建一卡片布局管理器,并指定左右边距和上下边距。

下面用CardLayout写了一个小例子:

注意测试环境是JDK1.6,其中透明属性是1.6之后才有,所以低于1.6不能运行,而使用的透明方法在JDK1.7中对此方法做了修改,所以1.7也会运行错误详见

       主要用到BorderLay,FlowLayout来布局按钮和面板,图片采用的是CardLayout,然后几个按钮的监听事件也是调用CardLayout布局管理器中的一些方法。
源码:

package osc.test.cardlayout;

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

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class CardTest extends JFrame {
	public static final Image LOG = new ImageIcon(
			CardTest.class.getResource("/images/LOG.png")).getImage();;
	private CardLayout cardLayout;

	private JPanel imagePanel;
	private ImageLabel[] imageLabels;

	private JPanel buttonPanel;
	private JButton firstButton;
	private JButton previousButton;
	private JButton nextButton;
	private JButton lasButton;

	public CardTest() {
		super("CardLayout Test --by  Alog2012");
		init();
	}

	private void init() {
		Container container = getContentPane();
		container.add(getImagePanel(), BorderLayout.CENTER);
		container.add(getButtonPanel(), BorderLayout.SOUTH);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.95f);
		pack();
		// 获取系统工具箱
		Toolkit kit = Toolkit.getDefaultToolkit();
		int scrW = kit.getScreenSize().width;
		int scrH = kit.getScreenSize().height;
		int locale_x = (scrW - getSize().width) / 2;
		int locale_y = (scrH - getSize().height) / 2;
		super.setLocation(locale_x, locale_y);
		super.setIconImage(LOG);
		setVisible(true);
	}

	protected JPanel getImagePanel() {
		imagePanel = new JPanel(cardLayout = new CardLayout());
		setMinimumSize(new Dimension(240, 200));
		setPreferredSize(new Dimension(540, 450));
		setMaximumSize(new Dimension(720, 640));
		imageLabels = getImageLabels();
		for (int i = 0; i < 8; i++) {
			imagePanel.add(imageLabels[i], String.valueOf(i));
		}
		return imagePanel;
	}

	protected ImageLabel[] getImageLabels() {
		imageLabels = new ImageLabel[8];
		for (int i = 0; i < 8; i++) {
			Image image = new ImageIcon(
					CardTest.class.getResource("/images/pic_" + i + ".jpg"))
					.getImage();
			imageLabels[i] = new ImageLabel(image);
		}
		return imageLabels;
	}

	protected JPanel getButtonPanel() {
		buttonPanel = new JPanel();
		buttonPanel.add(getFirstButton());
		buttonPanel.add(getPreviousButton());
		buttonPanel.add(getNextButton());
		buttonPanel.add(getLasButton());
		return buttonPanel;
	}

	protected JButton getFirstButton() {
		firstButton = new JButton("首页");
		firstButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cardLayout.first(imagePanel);
			}
		});
		return firstButton;
	}

	protected JButton getPreviousButton() {
		previousButton = new JButton("向前");
		previousButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cardLayout.previous(imagePanel);
			}
		});
		return previousButton;
	}

	protected JButton getNextButton() {
		nextButton = new JButton("向后");
		nextButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cardLayout.next(imagePanel);
			}
		});
		return nextButton;
	}

	protected JButton getLasButton() {
		lasButton = new JButton("末页");
		lasButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cardLayout.last(imagePanel);
			}
		});
		return lasButton;
	}

	class ImageLabel extends JLabel {
		private Image image;

		public ImageLabel(Image image) {
			this.image = image;
		}

		protected void paintComponent(Graphics g) {
			g.drawImage(image, 0, 0, getSize().width, getSize().height, this);
		}
	}

	public static void main(String[] args) {
		try {
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
		} catch (Exception e) {
			e.printStackTrace();
		}
		new CardTest();
	}
}




参考:

1. Pro Java Programming(Second Edition)

 2. Core Java I

 


分享到:
评论

相关推荐

    第七个范例——布局之LayoutContainer

    【标题】"第七个范例——布局之LayoutContainer"是一个关于软件开发中界面设计的讨论,特别是关注如何使用布局管理器来组织用户界面元素。在软件开发中,尤其是在图形用户界面(GUI)的设计中,LayoutContainer是...

    GUI编程技术-布局管理.doc

    #### 四、卡片布局——CardLayout **1. 基本概念** `CardLayout`允许在一个容器中放置多个组件,但每次只显示其中一个组件,类似于堆叠起来的卡片。这种方式非常适合实现多页面的应用程序。 **2. 构造方法** - `...

    第九个范例——布局之StackContainer

    【标题】:“第九个范例——布局之StackContainer”指的是在软件开发中,特别是图形用户界面(GUI)设计中的一种布局管理方式。StackContainer是一种布局容器,它将组件按照栈的方式进行排列,就像堆叠的卡片一样。...

    swing-layout-1.0.jar

    `swing-layout-1.0.jar`库文件提供了一个额外的布局管理器——`BoxLayout2`,它是对Java标准库中`BoxLayout`的增强。`BoxLayout2`允许开发者在容器的任意轴上进行布局,并且增加了更多的对齐选项和间距控制。此外,...

    Java.Swing图形界面开发与案例详解.王鹏等——第5章

    Swing提供了多种布局管理器,如FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout。每种布局管理器都有其特定的排列规则,开发者可以根据需要选择合适的布局。 事件处理是Swing应用程序中实现用户...

    Java.Swing图形界面开发与案例详解.王鹏等——第8章

    常见的布局管理器有FlowLayout、BorderLayout、GridLayout、CardLayout和BoxLayout等。例如,FlowLayout按顺序将组件水平或垂直排列;BorderLayout将容器分为五个区域:北、南、东、西和中心,每个区域只能放置一个...

    java技术——让学员少走弯路

    Java 提供了多种布局管理器,如 BorderLayout、FlowLayout、GridLayout、CardLayout 和 GridBagLayout,每种都有特定的排列规则。通过合理利用布局管理器,开发者可以轻松地创建美观且适应性强的界面。 在 AWT 的...

    java工程师信产部认证考试题库——2.pdf

    CardLayout是最灵活的布局方案之一,选项d正确。 4. 异常处理: - 题目29展示了自定义异常的创建。当输入值大于10时,应该使用`throw new Exception("message")`语句抛出自定义异常,因此选项c正确。 5. 图像绘制...

    java——swing

    Swing还支持布局管理器,如FlowLayout、BorderLayout、GridLayout和CardLayout,这些管理器帮助自动调整组件的位置和大小,以适应不同屏幕尺寸和分辨率。 描述中提到的“vc++串口通讯”,意味着这个Java Swing应用...

    合肥工业大学Java作业4.zip

    常见的布局管理器有FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout。理解并合理使用布局管理器是构建美观且响应良好的GUI的关键。 4. **事件处理**:Java GUI通过事件驱动模型进行交互。例如,...

    frame panle

    JPanel默认使用流式布局管理器(FlowLayout),但也可以根据需要更换为其他的布局管理器,如GridLayout、BorderLayout或CardLayout等。 在给定的文件名列表中,我们可以推测这些Java源代码文件可能与创建一个基于...

    可视化Java GUI程序设计基于Eclipse VE开发环境 课件

    3. **布局管理**:Eclipse VE支持多种布局管理器,如FlowLayout、BorderLayout、GridLayout、GridBagLayout和CardLayout等。选择合适的布局管理器可以使界面在不同大小的屏幕上自适应。 4. **事件处理**:通过双击...

    SWING—JAVA 基础类组件集

    - GridBagLayout:这是一个复杂的布局管理器,可以创建复杂的格状布局,每个组件可以指定其在网格中的位置和跨度。 - CardLayout:允许在同一个容器中切换显示不同的组件,就像翻卡片一样。 ### Swing的Look and ...

    精通JS脚本之ExtJS框架.part2.rar

    11.1.3 卡片式布局——CardLayout 11.1.4 列布局——ColoumnLayout 11.1.5 锚点布局——AnchorLayout 11.1.6 自适应布局——FitLayout 11.1.7 ContainerLayout 11.2 与布局有关的其他知识 11.2.1 父类Ext....

    java通讯录

    另一方面,卡片布局(CardLayout)则是布局管理器的一种,它将容器视为一组卡片,每次只能显示一张卡片。在通讯录应用中,这种布局可能用于实现动态切换联系人信息,例如,用户可以通过搜索或选择列表中的联系人,...

    精通JS脚本之ExtJS框架.part1.rar

    11.1.3 卡片式布局——CardLayout 11.1.4 列布局——ColoumnLayout 11.1.5 锚点布局——AnchorLayout 11.1.6 自适应布局——FitLayout 11.1.7 ContainerLayout 11.2 与布局有关的其他知识 11.2.1 父类Ext....

    Java相关jar包.rar

    Swing Layout Manager提供了一系列布局策略,如 FlowLayout、GridLayout、BorderLayout 和 CardLayout 等,使得开发者可以根据需求选择合适的布局来组织GUI元素。`swing-layout-1.0.jar`可能包含了自定义或增强的...

    Java.Swing图形界面开发与案例详解.王鹏等——第6章

    2. **布局管理器**: Swing提供了多种布局管理器,如FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout等,用于控制组件在容器中的排列方式。例如,FlowLayout按照顺序从左到右、从上到下放置组件;...

    swing练习1.zip

    2. **布局管理器**:Swing提供了多种布局管理器,如FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout。理解每种布局管理器的特点,能够根据需求选择合适的布局。 3. **事件处理**:学习如何添加...

Global site tag (gtag.js) - Google Analytics