前言
在Swing开发中,窗体部分除了可以是使用JFrame表示之外,还有其他几种常见的窗体:JPanel,JSplitPane,JTabledPane,JScrollPane,JDesktopPane,JInternalFrame等,下面分别介绍
JPanel
JPanel也是一种经常使用到的容器之一,可以使用JPenl完成各种复杂的界面显示,在JPanel中可以加入任意的组件,之后直接将JPenl容器添加到JFrame容器中即可显示。JPanel常用方法:
方法 | 描述 |
public JPanel() | 创建一个默认的JPanel对象,使用流式布局管理器 |
public JPanel(LayoutManager layout) | 创建一个指定布局管理器的JPanel对象 |
实例:JPanel的基本使用
import javax.swing.JPanel;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JFrame;
public class JPanelDemo01
{
public static void main(String args[])
{
// 实例化窗体对象
JFrame frame = new JFrame("使用面板JPanel容器");
// 准备好了一个面板
JPanel pan = new JPanel();
// 现在所有的内容都加入到了JPanel之中
//添加三个标签到面板中
JLabel label=null;
for(int i=0;i<3;i++)
{
label=new JLabel("标签 "+i);
label.setOpaque(true);
//设置三原色渐变
switch (i)
{
case 0 :
label.setBackground(new Color(0,0,255));
break;
case 1 :
label.setBackground(new Color(0,255,0));
break;
case 2 :
label.setBackground(new Color(255,0,0));
break;
default :
break;
}
pan.add(label);
}
//添加三个按钮到面板中
JButton button=null;
for(int i=0;i<3;i++)
{
button=new JButton("按钮 "+i);
switch (i)
{
case 0 :
button.setBackground(new Color(0,0,255));
break;
case 1 :
button.setBackground(new Color(0,255,0));
break;
case 2 :
button.setBackground(new Color(255,0,0));
break;
default :
break;
}
pan.add(button);
}
// 将面板加入到窗体之上
frame.add(pan);
// 根据组件自动调整大小
frame.pack();
frame.setLocation(300, 200);
frame.setVisible(true);
}
}
运行效果:
从程序的运行结果中可以发现所有的组件都是采用顺序的形式加入到JPanel中最后在将JPanel加入到JFrame中。
使用JPanel和布局管理器实现复杂的排版
使用JPanel和布局管理器相结合可以更加方便的管理组件,在窗体jFrame中可以使用布局管理器对多个JPanel进行排序,而每个JPanel中又可以使用不同的布局管理器管理组件,这样就可以对组件进行复杂的排列。
2.JSplitPane
JSplitPane的主要功能是分割面板,可以将一个窗体分成两个子窗口,可以是水平排列也可以是水平排列。
JSplitPane的主要方法以及常量:
序号 | 常量 | 描述 |
1 | public static final int HORIZONTAL_SPLIT | 表示水平分割 |
2 | public static final int VERTICAL_SPLIT | 表示垂直分割 |
序号 | 方法 | 描述 |
1 | public JSplitPane(int newOrientation) | 创建对象,并指明分割方式 |
2 | public JSplitPane(int newOrientation,boolean newContinuousLayout,Component newLeftComponent,Component newRightComponenr) | 创建对象,并指明分割方式,分割改变的时候是否重绘图像,左边和右边的显示组件 |
3 | public void setDividerLocation(double proportionalLocation) | 按百分设置分割条的位置 |
4 | public void setOneTouchExpandable(boolean newValue) | 设置是否提供快速展开/折叠的功能 |
4 | public void setDividerSize(int newSize) | 设置分割条的大小 |
实例:实现复杂分割
import javax.swing.JLabel;
import javax.swing.JFrame;
import java.awt.Container;
import javax.swing.JSplitPane;
public class JSplitPaneDemo01
{
public static void main(String args[])
{
// 实例化窗体对象
JFrame frame = new JFrame("分割窗口");
//获取当前窗体的容器对下
Container cont = frame.getContentPane();
JSplitPane left_split_right = null; // 左右分割
JSplitPane up_split_down = null; // 上下分割
//左右分割:左标签|右标签
JLabel leftLabel=new JLabel("左标签");
JLabel rightLabel=new JLabel("右标签");
left_split_right = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftLabel,rightLabel);
//注意: 水平分割分割线是垂直的,垂直分割分割线是水平的。
left_split_right.setDividerSize(10); // 设置左右分割条的分割线大小
// 左标签|右标签
// ——————————
// 下标签
left_split_right.setOneTouchExpandable(true);
left_split_right.setSize(400, 200);
up_split_down = new JSplitPane(JSplitPane.VERTICAL_SPLIT, left_split_right,
new JLabel("下标签"));
up_split_down.setDividerSize(10); // 设置左右分割条的分割线大小
//提供快速展开/折叠功能
up_split_down.setOneTouchExpandable(true);
cont.add(up_split_down);
frame.setSize(400, 300);
frame.setLocation(300, 200);
frame.setVisible(true);
}
}
运行效果:
分割条可以拖动:
点击分割条上面的三角形可以折叠展开窗体:
3.JTabbedPane
JTabbedPane是在一个面板上设置多个选项卡提供用户选择,如下图所示:
如果序号查看那方面的信息,则直接选择选项卡即可浏览。JTabbedPane的常用方法以及常量如下表所示:
序号 | 常量 | 描述 |
1 | static final TOP | 表示指向框顶部位置 |
2 | static final BOTTOM | 表示指向框底部位置 |
3 | static final LEFT | 表示指向框左部位置 |
4 | static final RIGHT | 表示指向框右部位置 |
序号 | 方法 | 描述 |
1 | public JTabbedPane(int tabPalcement) | 创建对象,并指定选项卡布局 |
2 | public void addTab(String title,Component component) | 添加一个有标题而没有图标的组件 |
3 | public void addTab(Sting title,Icon icon,Component component) | 添加一个有标题,有图标的组件 |
4 | public void addTab(Sting title,Icon icon,Component component,String tip) | 添加一个有标题,有图标,有提示消息的组件 |
实例:设置选项卡
import java.awt.Container;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
public class JTabbedPaneDemo01
{
public static void main(String args[])
{
// 实例化窗体对象
JFrame frame = new JFrame("选项卡:JTabbedPane");
// 获取窗体的容器
Container cont = frame.getContentPane();
JTabbedPane tab = null;
tab = new JTabbedPane(JTabbedPane.TOP);// 设置标签在顶部显示
JPanel pan1 = new JPanel();
JPanel pan2 = new JPanel();
JPanel pan3 = new JPanel();
JButton but = new JButton("按钮1");
JButton but2 = new JButton("按钮2");
JLabel lab = new JLabel("标签1");
JLabel lab1 = new JLabel("标签2");
pan1.add(but);
pan1.add(but2);
pan2.add(lab);
pan2.add(lab1);
String picPath = "C:\\Users\\Administrator\\Desktop\\image\\62.gif";
JLabel lab3 = new JLabel(new ImageIcon(picPath));
pan3.add(lab3 );
//添加一个有标题,图标,,有提示消息的选项卡的组件,
//当光标放在放在该选项卡上的时候会显示提示消息
tab.addTab("图片选项卡", new ImageIcon(picPath), pan1, "提示消息");
//添加一个选项卡,选项卡中放入一个面板
tab.addTab("文字选项卡", pan2);
tab.addTab("其他选项卡", pan3);
//把这些选项卡组件添加到窗体中
cont.add(tab);
frame.setSize(400, 300);
// frame.pack();
frame.setLocation(300, 200);
frame.setVisible(true);
}
}
运行结果:
上面建立了三个选项卡,并且把选项卡放在了窗体的顶部。
这里应该有层次关系图的,但是我不会画。以后补上吧。
JScrollPane
在一般的图形界面中如果显示的区域不够大,往往会出现滚动条以便用户浏览。在Swing中JScrollPane的主要功能就是为显示的内容加入滚动条。JScrollPane主要由JViewport和JScrollPane两部分组成,JViewport主要是显示一个矩形的区域让用户浏览,而后者主要是形成水平或者垂直的滚动条。不过在开发中一般情况下不经常使用这两个类,因为在JScrollPane中已经为开发这提供了足够的功能。
序号 | 常量 | 描述 |
1 | static final int HORIZONATAL_SCROLLBAR_ALWAYS | 始终显示水平滚动条 |
2 | static final int HORIZONATAL_SCROLLBAR_NEVER | 任何情况下都不显示水平滚动条 |
3 | static final int HORIZONATAL_SCROLLBAR_AS_NEEEDED | 根据自身序号显示水平滚动条 |
4 | static final int VERTICAL_SCROLLBAR_AS_ALWAYS | 始终显示垂直滚动条 |
5 | static final int VERTICAL_SCROLLBAR_NEVER | 任何情况下都不显示垂直滚动条 |
6 | static final int VERTICAL_SCROLLBAR_AS_NEEEDED | 根据自身序号显示垂直滚动条 |
序号 | 方法 | 描述 |
7 | public JScrollPane(Component view) | 将指定的组件加入滚动条,根据大小显示水平或者垂直滚动条 |
8 | public JScrollPane(Component view,int vsbPolicy,int hsbPolicy) | 将指定的组件加入滚动条,根据需要设置是否显示垂直或者水平滚动条 |
实例:为图片设置滚动条
电脑崩溃,在重装系统中。后面补上。
JDesktopPane与JInternalFrame
在Swing中也可以完成内部窗体的显示,即在一个窗体中可以有多个窗体。每一个子窗体都无法超父窗体的区域。
JDesktopPane规定了一个窗体的基本形式,而JInternalFrame规定各个子窗体,JInteralFrame需要加入到JDesktopPane中。这两个类的常用方法如下表所示。
序号 | 方法 | 描述 |
1 | public JDesktopPane() | 创建一个JDesktopPane对象 |
2 | public void setSelectedFrame(JInternalFrame f) | 设置此 JDesktopPane 中当前活动的 JInternalFrame。 |
序号 | 方法 | 描述 |
1 | public JInternalFrame(String title) | 创建不可调整大小的、不可关闭的、不可最大化的、不可图标化的、具有指定标题的 JInternalFrame。 |
2 | public JInternalFrame(String title, boolean resizable) | 创建不可关闭的、不可最大化的、不可图标化的,以及具有指定标题和可调整大小的 JInternalFrame。 |
2 | public JInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) | 创建具有指定标题、可调整、可关闭、可最大化和可图标化的 JInternalFrame。 |
实例:设置内部窗体:
import java.awt.Container;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import java.awt.BorderLayout;
public class JInternalFrameDemo01
{
public static void main(String args[])
{
// 实例化窗体对象
JFrame frame = new JFrame("外部窗体");
//获取窗体的容器
Container cont = frame.getContentPane();
// 定义窗体的容器
JDesktopPane desk = new JDesktopPane();
// 把内部面板加入到当前窗体中,设置布局
cont.add(desk, BorderLayout.CENTER);
// 当前面板中加入一个标签
cont.add(new JLabel("内部窗体"), BorderLayout.SOUTH);
JInternalFrame jif = null;
String picPath = "C:\\Users\\lan\\Desktop\\image\\62.gif";
Icon icon = new ImageIcon(picPath); // 实例化Icon对象
JPanel pan = null;
for (int i = 0; i < 3; i++)
{
// JInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable)
// 创建具有指定标题、可调整、可关闭、可最大化和可图标化的 JInternalFrame。
jif = new JInternalFrame("内部窗体 " + i, true, true, true, true);
//创建面板
pan = new JPanel();
//面板中加入标签
pan.add(new JLabel(icon));
//设置内部窗体显示的位置
jif.setLocation(i * 102,0);
//内部窗体中加入面板
jif.add(pan);
//设置内部窗体的大小
jif.setSize(100, 100);
//设置内部窗体可见
jif.setVisible(true);
//内部面板添加一个内部窗体
desk.add(jif);
}
//设置外部窗体大小
frame.setSize(400, 200);
//设置外部窗体位置
frame.setLocation(300, 200);
//设置外部窗体可见
frame.setVisible(true);
}
}
运行效果:
内部窗体可以在面板内部自由的放大缩小,移动,但是不能移除外部窗体之外。