高级组件面板

1.分割面板

分割面板由javax.swing.JSplitPanc类实现,用来将其所在的区域分割成两部分,可以根据实际情况决定分割方向,既水平方向和垂直方向。可以通过调整分隔条的位置来改变这两部分的相对大些。该功能可以有效增加界面的可用空间,这就是分割面板的主要特点。
JSplitPane 类的常用构造方法:

构造方法

说明

JSplitPane()

创建一个默认的分割面板。默认情况下为在水平方向分割,重绘方式为只在调整分隔条位置完成是重绘

JSplitPane(int newOrientation)

创建一个按照指定方向的分割面板。入口参数 newOrientation 的可选静态常量有 HORIZOBTAL_SPLIT ( 水平方向分割,为静态常量 ) 和 VERTICAL_SPLIT (在垂直方向分割)

JSplitPane(int new Oriectation,boolean newContinuousLayout)

创建一个按照指定方向分割,并且按照指定方式重绘的分割面板。如果将入口参数 newContinuousLayout 设为true,表示在调整分隔条位置的过程中连续重绘,设为false 则表示只在调整分隔条位置完成时重绘

JSplitPane 类的oneTouchExpandable 属性用来控制是否在分隔条提供一个 UI 小部件,该小部件用来快速展开和折叠被分割的两个区域。。它的默认值为false(不提供该小部件);如果是 true 则表示提供该小部件,在分隔条上方提供了两个三角形按钮,单击这两个按钮,就可以快速地将相应的部分调整为占据分割面板所在整个区域,或者是恢复为之前的状态,通过 setOneTouchExpandable(boolean isProvide) 方法设置该属性的值。
JSplitPane 类的常用方法:

方法

说明

setOrientation(int orientation)

设置分割面板的分割方向,水平方向(默认)或者垂直方向

setDividerLocation(int location)

设置分隔条的绝对位置,即分隔条左侧(水平分割)的宽度或者上方(垂直分割)的高度

setDividerLocation(double proportionalLocation)

设置分隔条的相对位置,即分隔条左侧(水平分割)或者上方(垂直分割)的大小与分割面板大小的百分比

setDividerSize(int newSize)

设置分隔条的宽度。默认为5像素

setLeftComponent(Component comp)

将组件添加到分隔条的左侧(水平分割)或上方(垂直分割)

setTopComponent(Component comp)

将组件添加到分隔条的上方(垂直分割)或上方(水平分割)

setRightComponent(Component comp)

将组件添加到分隔条的右侧(水平分割)或上方(垂直分割)

setBottomComponent(Component comp)

将组件添加到分隔条的下方侧(垂直分割)或上方(水平分割)

setOneTouchExpandable(boolean newValue)

设置分割面板是否提供 UI小部件。设为true表示提供,有些外观可能不支持该功能,这是将忽略该设置;设置为false则表示不提供,默认为不提供

setContinuousLayout(boolean newContinuousLayout )

设置调整分隔条位置是面板的重绘方式。设置为 true 表示在调整过程中连续重绘,设为 false 则表示只在调整完成时重绘

例子

public class Test extends JFrame{	// 继承JFrame类
	public static void main(String[] args){
		Test frame = new Test();
		frame.setVisible(true);	// 使Test窗体可见
	}
	public Test(){
		super();
		setTitle("分割面板");	// 设置窗体名称
		setBounds(100,100,500,375);	// 设置窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	//设置窗体关闭模式
		//创建一个水平方向的分割面板
		final JSplitPane splitPane = new JSplitPane();
		//分隔条左侧的宽度为40像素
		splitPane.setDividerLocation(40);
		//添加到指定区域
		getContenPane().add(splitPane,BordeLayout.CENTER);
		//在水平面板左侧添加一个标签组件
		splitPane.setLeftComponent(new JLable("     1"));
		//创建一个垂直方向的分割面板
		final JSplitPane vsplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
		//分隔条上方的高度为30像素
		vsplitPane.setDividerLocation(30);
		vsplitPane.setDividerSize(8);	//分隔条的宽度为8像素
		vsplitPane.setOneTouchExpandable(true); // 提供UI小部件
		//调整分隔条位置时面板的重绘方式
		vsplitPane.setContinuousLayout(true);
		splitPane.setRigthComponent(vsplitPane);	//	添加到水平面板的右侧
		//在垂直面板上方添加一个标签组件
		vsplitPane.setLeftComponnent(new JLable("      2"));
		//在垂直面板右侧添加一个标签组件
		vsplitPane.setRightComponent(new JLable("    3"));
	}
}

2.选项卡面板

选项卡面板由 javax.swing.JTabbedPane 类实现,它实现的是一个多卡片的用户界面,通过它可以讲一个复杂的对话框分割成若干个选项卡,实现对信息的分类显示和管理,使界面更整洁大方,还可以有效地减少窗体个数。
JTabbedPane 类提供的构造方法:

构造方法

说明

JTabbedPane()

创建一个默认的选项卡面板。默认情况下标签在选项卡的上方,布局方式为限制布局

JTabbePane(int tabPacement)

创建一个指定标签显示位置的选项卡面板。入口参数 tabPacement 的可选静态常量有TOP(在选项卡上方,为默认值)、BOTTOM(在选项卡下方)、LEFT(在选项卡左侧)和 RIGHT(在选项卡右侧)

JTabbedPane(int tabPacement, int tabLayoutPolicy)

创建一个既可以指定标签显示位置,又指定选项卡布局方式的选项卡面板。入口参数 tabLayoutPolicy 的可选静态常量有 WRAP_TAB_LAYOUT(限制布局为默认值)和 SCROLL_TAB_LAYOUT (滚动布局)

import java.awt.BorderLayout;
import java.net.URL;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ExampleFrame_2 extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {
		ExampleFrame_2 frame = new ExampleFrame_2();
		frame.setVisible(true);// 使窗体可见
	}

	public ExampleFrame_2() {
		super();
		getContentPane().setFocusCycleRoot(true);
		setTitle("选项卡面板");
		setBounds(100, 100, 500, 375);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		final JTabbedPane tabbedPane = new JTabbedPane();
		// 设置选项卡标签的布局方式
		tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
		tabbedPane.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				// 获得被选中的选项卡的索引
				int selectedIndex = tabbedPane.getSelectedIndex();
				// 获得指定索引的选项卡标签
				String title = tabbedPane.getTitleAt(selectedIndex);
				System.out.println(title);
			}
		});
		getContentPane().add(tabbedPane, BorderLayout.CENTER);
		URL resource = ExampleFrame_2.class.getResource("/tap.jpg");//	图片位置为src根目录
		ImageIcon imageIcon = new ImageIcon(resource);
		final JLabel tabLableA = new JLabel();
		tabLableA.setText("选项卡A");
		// 将标签组件添加到选项卡
		tabbedPane.addTab("选项卡A", imageIcon, tabLableA, "点击查看选项卡A");
		final JLabel tabLableB = new JLabel();
		tabLableB.setText("选项卡B");
		tabbedPane.addTab("选项卡B", imageIcon, tabLableB, "点击查看选项卡B");
		final JLabel tabLableC = new JLabel();
		tabLableC.setText("选项卡C");
		tabbedPane.addTab("选项卡C", imageIcon, tabLableC, "点击查看选项卡C");
		tabbedPane.setSelectedIndex(2);// 设置索引为2的选项卡被选中
		tabbedPane.setEnabledAt(0, false);// 设置索引为0的选项卡不可用

	}
}

3.桌面面板和内部窗体

在一个GUI应用程序中需要使用多个窗口,针对这些窗口可以采用两种管理策略:一种是每个窗口都是独立的窗体,它的优点是可以通过系统主窗体上的按钮及快捷键浏览到所有窗口。通过JFrame 类实现;另一种是提供一个主窗体,然后将其他窗口放到主窗体中,它的优点是减少窗口的混乱。使用JDesktopPane 类和 JInternalFrame 类(分别称为桌面面板类和内部窗体类)。
JDesktopPane 常用的方法:

方法

说明

getAllFrame()

以数组的形式返回桌面中当前显示的所有 JInternalFrame

getSelectedFrame()

获得桌面中当前被选中的 JInternalFrame ,如果没有被选中的 JInternalFrame ,则返回 null

removeAll()

从桌面中移除所有的 JInternalFrame

remove(int index)

从桌面中移除位于指定索引的 JInternalFrame

setSelectedFrame(JInternalFrame f)

设置指定的 JInternalFrame 为当前被选中的窗体

setDragMode(int dragMode)

设置窗体的拖动模式,入口参数的可选静态常量有 LIVE_DRAG_MODE 和 OUTLINE_DRAG_MODE

JInternalFrame 类的构造方法入口函数说明:

入口参数

说明

title

为内部窗体的标题

resizable

设置是否允许自由调整大小,设为 true 则表示允许,设为 false (为默认值)则表示不允许

closable

设置是否提供 “关闭 ” 按钮 ,设为 true 则表示提供,设为 false(为默认值)则表示不提供

maximizable

设置是否提供 “ 最大化 ” 按钮,设为 true 表示提供,设为 false (为默认值)则表示不提供

iconifiable

设置是否提供 “ 最小化 ” 按钮,设为 true 表示提供,设为 false(为默认值)则表示不提供

JInternalFrame 类中常用方法:

方法

说明

setResizable(boolean b)

设置是否允许自由调整大小

setClosable(boolean b)

设置是否提供关闭按钮

setMaximiable(boolean b)

设置是否提供 “ 最大化 ”按钮

setIconifiable(boolean b)

设置是否提供 “ 最小化 ”按钮

setSelected(boolean b)

设置是否被激活,设为 true 表示激活窗体,设为 false (为默认值)则表示不激活窗体

isMaximum()

查看窗体是否处于最大化状态

isIcon()

查看窗体是否处于最小化状态

isClosed()

查看窗体是否已经被关闭

setFrameIcon(Icon icon)

设置窗体标题栏显示的图标

列:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.net.URL;
import javax.swing.*;

public class ExampleFrame_04 extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	JDesktopPane desktopPane = null;// 定义一个桌面面板
	Internalframe pInFrame = null;// 定义一个人事管理内部窗体对象
	Internalframe rInternalframe = null;// 定义一个账套管理内部窗体对象
	Internalframe tInternalframe = null;// 定义一个待遇报表内部窗体对象

	public static void main(String[] args) {
		ExampleFrame_04 frame = new ExampleFrame_04();
		frame.setVisible(true);// 设置窗体可见
	}

	public ExampleFrame_04() {
		super();
		setTitle("企业人事管理系统");
		setBounds(100, 100, 570, 470);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 创建桌面面板
		desktopPane = new JDesktopPane();// 创建桌面面板对象
		// 设置内部窗体的拖动模式
		desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
		getContentPane().add(desktopPane, BorderLayout.CENTER);
		// 为桌面面板添加背景图片
		final JLabel backLabel = new JLabel();// 创建一个标签组件对象
		// 获得背景图片路径
		URL resource = this.getClass().getResource("/back.jpg");
		ImageIcon icon = new ImageIcon(resource);// 创建背景图片对象
		backLabel.setIcon(icon);// 令标签组件显示背景图片
		// 设置组件显示位置及大小
		backLabel.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());
		// 将标签组件添加到指定索引位置
		desktopPane.add(backLabel, new Integer(Integer.MIN_VALUE));
		// 添加按钮
		final JPanel panel = new JPanel();
		final FlowLayout flowLayout = new FlowLayout();
		flowLayout.setAlignment(FlowLayout.LEFT);
		panel.setLayout(flowLayout);
		getContentPane().add(panel, BorderLayout.NORTH);

		final JButton personnelButton = new JButton();
		personnelButton.setText("人事管理");
		personnelButton.addActionListener(new BAListener(pInFrame, "人事管理"));
		panel.add(personnelButton);

		final JButton reckoningButton = new JButton("账套管理");
		reckoningButton.addActionListener(new BAListener(rInternalframe, "账套管理"));
		panel.add(reckoningButton);

		final JButton treatmentButton = new JButton("待遇报表");
		treatmentButton.addActionListener(new BAListener(tInternalframe, "待遇报表"));
		panel.add(treatmentButton);
	}

	private class BAListener implements ActionListener {
		Internalframe inFrame;
		String title;

		public BAListener(Internalframe inFrame, String title) {
			this.inFrame = inFrame;
			this.title = title;
		}

		public void actionPerformed(ActionEvent e) {
			if (inFrame == null || inFrame.isClosed()) {
				// 获得桌面面板中的所有内部窗体
				JInternalFrame[] allFrames = desktopPane.getAllFrames();
				int titleBraHight = 30 * allFrames.length;
				int x = 10 + titleBraHight, y = x;// 设置窗体显示位置
				int width = 250, height = 180;// 设置窗体大小
				inFrame = new Internalframe(title);// 创建指定标题的内部窗体
				// 设置窗体显示位置及大小
				inFrame.setBounds(x, y, width, height);
				inFrame.setVisible(true);// 设置窗体可见
				desktopPane.add(inFrame);
			}
			try {
				inFrame.setSelected(true);
			} catch (PropertyVetoException propertyE) {
				// TODO 自动生成的 catch 块
				propertyE.printStackTrace();
			}

		}

	}

	private class Internalframe extends JInternalFrame {
		/**
		 * 
		 * @param title
		 */
		public Internalframe(String title) {
			super();
			setTitle(title);// 设置内部窗体的标题
			setResizable(true);// 设置允许自由调整大小
			setClosable(true);// 设置提供关闭按钮
			setIconifiable(true);// 设置提供图标化按钮
			setMaximizable(true);// 设置提供最大化按钮
			// 获取图片路径
			URL resource = this.getClass().getResource("/in_frame.png");
			ImageIcon icon = new ImageIcon(resource);// 创建图片对象
			setFrameIcon(icon);// 设置图标
		}
	}
}