高级组件面板
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);// 设置图标
}
}
}