Java Swing容器
Swing中的容器可以分为两类:顶层容器和中间容器。顶层容器有四种:JFrame、JDialog、JWindow和JApplet。中间容器主要有JPanel、JScrollPane、JSplitPane、JTabbedPane等。
目录
显示在屏幕上的所有组件都必须包含在某个容器中,容器可以嵌套使用。Swing中的容器可以分为两类:顶层容器和中间容器。顶层容器有四种:JFrame、JDialog、JWindow和JApplet。中间容器主要有JPanel、JScrollPane、JSplitPane、JTabbedPane等。下面,我一些常见的容器使用方法。
1. 框架
框架(JFrame)是Swing中使用最为广泛的一种顶层容器,它继承于AWT组件库中的Frame类,而Frame类是Window的一个子类。由JFrame类或其子类创建的对象是一个带有标题行和控制按钮(最小化、恢复、最大化、关闭)的独立窗口,创建GUI应用程序时一般需要是使用JFrame。JFrame的构造方法主要两种,默认构造方法和带参数构造方法,通过默认构造方法可以创建一个无标题的窗口,通过带参数的构造方法可以创建一个带有标题的窗口。下面通过一个例子来说明如何利用JFrame创建窗口。
【例1】利用JFrame创建窗口
import javax.swing.JFrame;
public class JFrameDemo1 {
public static void main(String[] args) {
JFrame frame1=new JFrame(); //创建无标题的框架窗口
frame1.setTitle("我的窗口"); //设置窗口的标题
frame1.setSize(300,200); //设置窗口的宽度和高度
frame1.setLocation(100,200);//设置窗口的显示位置
frame1.setVisible(true); //设置窗口的可见性
}
}
上面程序运行结果如下所示。
每个顶层容器都有一个内容窗格,内容窗格是一种Container容器,顶层容器中除了菜单组件之外的其它组件都直接或间接地放在这个内容窗格中。将组件放置到内容窗格有两种方法,一种是通过顶层容器的getContentPane()方法获得其默认的内容窗格,然后将组件添加到这个内容窗格中。另外一种是创建一个新的内容窗格取代顶层容器的默认内容窗格,接下来将组件放到这个新创建中的内容窗格中。下面是一个在JFrame的默认内容窗格中添加按钮组件的例子。
【例2】在JFrame的默认内容窗格中添加组件
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
public class JFrameDemo1 {
public static void main(String[] args) {
JFrame frame1=new JFrame(); //创建无标题的框架窗口
frame1.setTitle("我的窗口"); //设置窗口的标题
frame1.setSize(300,200); //设置窗口的宽度和高度
frame1.setLocation(100,200);//设置窗口的显示位置
//获取顶层容器的默认内容窗格
Container contentPane=frame1.getContentPane();
//创建一个按钮组件
JButton button1=new JButton("确定");
//将按钮放在窗口的下方
contentPane.add(button1,BorderLayout.SOUTH);
//设置窗口的图标
frame1.setIconImage(new ImageIcon("./src/img/logo1.jpg").getImage());
//设置关闭行为
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setVisible(true); //设置窗口的可见性
}
}
上面程序运行结果如下图所示。
顶层容器默认窗格的布局管理器是边界布局(BorderLayout),边界布局将容器划分北(North)、南(South)、西(West)、东(East)、中(Center)五个区域,分别代表容器的上、下、左、右和中部,此例中,将按钮组件放到窗口的下部。关于布局管理器的内容在8.4节中详细介绍。在上面程序中,通过方法setTitle(int width,int height)设置窗口的初始大小;通过方法setLocation(int x,int y)设置窗口的初始位置;通过方法setIconImage(Icon icon)设置窗口的图标;通过方法setDefaultCloseOperation(int operation)设置窗口的关闭行为,其中,operation的取值可以是以下几种,默认是HIDE_ON_CLOSE。
- JFrame.DO_NOTHING_ON_CLOSE:当窗口关闭时,不做任何处理。
- JFrame.HIDE_ON_CLOSE:当窗口关闭时,隐藏这个窗口。
- JFrame.DISPOSE_ON_CLOSE:当窗口关闭时,隐藏并处理这个窗口。
- JFrame.EXIT_ON_CLOSE:当窗口关闭时,退出程序。
可以将创建一个面板来代替顶层容器的默认内容窗格,其代码如下。
【例3】在JFrame的替代内容窗格中添加组件。
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JFrameDemo2 {
public static void main(String[] args) {
JFrame frame1=new JFrame(); //创建无标题的框架窗口
frame1.setTitle("我的窗口"); //设置窗口的标题
frame1.setSize(300,200); //设置窗口的宽度和高度
frame1.setLocation(100,200);//设置窗口的显示位置
JPanel contentPane=new JPanel();//创建一个面板
contentPane.setLayout(new BorderLayout());//将面板设置为边界布局
JButton button1=new JButton("确定");//创建一个按钮组件
contentPane.add(button1,BorderLayout.SOUTH); //将按钮放在面板的下方
frame1.setContentPane(contentPane); //将面板设置为顶层容器的内容窗格
//设置窗口的图标
frame1.setIconImage(new ImageIcon("./src/img/logo1.jpg").getImage());
//设置关闭行为
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setVisible(true); //设置窗口的可见性
}
}
例3的运行结果与例2的运行结果是一致的。
2. 面板
面板(JPanel)是Swing的一种中间容器,它可以包含基本组件,并可以嵌套使用,但不能能独立运行,必须被添加到其它容器内部。在例3中,我们创建一个JPanel面板代替JFrame的内容窗格并在其上放置一个按钮,此时,该JPanel面板被包含在JFrame顶层容器中。
【例4】JPanel面板的使用。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JPanelDemo extends JFrame{
JPanel panel1,panel2;//定义两个面板
JButton button1,button2;//定义两个按钮
public JPanelDemo() {
this.setTitle("登录窗口");
this.setSize(300,200);
this.setLocation(200, 200);
panel1=new JPanel();//创建面板1
panel2=new JPanel();//创建面板2
button1=new JButton("登录");//创建按钮1
button2=new JButton("退出");//创建按钮2
panel2.add(button1);//将按钮1放到面板2中
panel2.add(button2);//将按钮2放到面板2中
panel1.setBackground(Color.GREEN);//设置面板1的背景颜色为绿色
Container contentPane=this.getContentPane();//获取默认窗格
contentPane.add(panel1,BorderLayout.CENTER);//将面板1放到窗口中部
contentPane.add(panel2,BorderLayout.SOUTH);//将面板2放到窗口下部
this.setVisible(true);
}
public static void main(String[] args) {
JPanelDemo frame=new JPanelDemo();
}
}
在上面程序中,我定义了JFrame类的一个子类JPanelDemo,JPanelDemo继承了JFrame的特征,可以在JPanelDemo的构造函数中设置窗口的标题、大小等属性。在JPanelDemo中定义了两个面板和两个按钮,其中,第一个面板放到了窗口的中部,第二个面板放到了窗口的下部,两个按钮都放到了第二个面板中,面板的默认布局管理器是流式布局(FlowLayout),该布局组件逐个地安放到容器中的一行上,一行放满后就另起一个新行。程序的运行界面如下图所示。
3. 分割面板
分割面板(JSplitPane)是Swing的一种中间容器,它可以将一个面板划分为左右或上下两个区域,每个区域可以看作是一个独立的容器。JSplitPane提供了两个常量:HORIZONTAL_SPLIT和VERTICAL_SPLIT,分别用来设置水平分割和垂直分割,通过水平分割可以将面板划分为左右两个部分,通过垂直分割可以将面板划分为上下两部分。若要将一个面板划分为两个以上的区域,则需要同时使用多个JsplitPane。
【例5】分割面板JSplitPane的使用。
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSplitPane;
public class JSplitPaneDemo extends JFrame{
JSplitPane hsplitPane,vsplitPane;//定义两个分割面板
JLabel left,rightTop,rightBottom; //定义三个标签组件
public JSplitPaneDemo() {
this.setTitle("我的窗口");
this.setSize(400,300);
//创建左右分割面板和
hsplitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
//创建上下分割面板
vsplitPane=new JSplitPane(JSplitPane.VERTICAL_SPLIT);
//创建三个标签组件
left=new JLabel("左侧");
rightTop=new JLabel("右上侧");
rightBottom=new JLabel("右下侧");
//设置水平分割面板的属性
hsplitPane.setOneTouchExpandable(true);//让分割条显示出箭头
hsplitPane.setContinuousLayout(true);//在调整分割条过程中连续重绘图形
hsplitPane.setDividerSize(8);//设置分割条的宽度
hsplitPane.setDividerLocation(100);//设置分割条左侧的宽度
//设置垂直分割面板的属性
vsplitPane.setOneTouchExpandable(true);
vsplitPane.setContinuousLayout(true);
vsplitPane.setDividerSize(8);
vsplitPane.setDividerLocation(200);//设置分割条上侧的高度
//将标签添加到水平分割面板的分割条左侧
hsplitPane.setLeftComponent(left);
//将垂直分割面板添加到水平分割面板的分割条右侧
hsplitPane.setRightComponent(vsplitPane);
//标签添加到垂直分割面板的分割条上侧
vsplitPane.setLeftComponent(rightTop);
//将标签添加到垂直分割面板的分割条下侧
vsplitPane.setRightComponent(rightBottom);
//用水平分割面板替换窗口的内容窗格
this.setContentPane(hsplitPane);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
JSplitPaneDemo frame=new JSplitPaneDemo();
}
}
程序运行界面如下图所示。
在该程序中,我定义了JFrame类的一个子类JSplitPaneDemo,在JSplitPaneDemo中定义了两个分割面板hsplitPane和vsplitPane,三个标签组件left,rightTop和rightBottom。hsplitPane为水平分割面板,vsplitPane为垂直分割面板,left放到hsplitPane的左侧,vsplitPane放到hsplitPane的右侧,rightTop和rightBottom分别放到vsplitPane的上侧和下侧。在SplitPane中,函数setOneTouchExpandable(boolean newValue)的功能是设置属性oneTouchExpandable的值,要想在分割条上提供一个小部件来快速地展开/折叠分割条,该属性的取值为true;函数setContinuousLayout(boolean newContinuousLayout)的功能是设置属性continuousLayout的值,在调整分割条的过程中要使子组件连续地重新显示和布局,该属性的取值为true;函数setDividerSize(int newSize)的功能是设置分割条的宽度;函数setDividerLocation(int location)的功能是设置分割条左侧的宽度或上侧的高度。
4. 选项卡面板
选项卡面板(JTabbedPane)是Swing的一种中间容器,它允许用户通过点击给定的标题或图标的标签,在一组选项卡之间进行切换显示,每个选项卡既可以是一个中间容器也可以是一个基本组件。JTabbedPane提供了四个常量TabbedPane.TOP, JTabbedPane.BOTTOM, JTabbedPane.LEFT和JTabbedPane.RIGHT用来指定标签的位置,它们分别表示标签位于面板的上方、下方、左方和右方。JTabbedPane提供了两个常量JTabbedPane.WRAP_TAB_LAYOUT和JTabbedPane.SCROLL_TAB_LAYOUT用来设置选项卡的布局方式,前者为限制布局,后者为滚动布局,默认为限制布局。
【例8.6】选项卡面板JTabbedPane的使用。
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
public class JTabbedPaneDemo extends JFrame{
JTabbedPane tabbedPane;//定义一个选项卡面板
JPanel panel1,panel2,panel3;//定义三个面板
public JTabbedPaneDemo() {
this.setTitle("我的窗口");
this.setSize(400,300);
//创建选项卡面板,标签位于上方,滚动布局
tabbedPane=new JTabbedPane(JTabbedPane.TOP,
JTabbedPane.SCROLL_TAB_LAYOUT);
//创建三个面板
panel1=new JPanel();
panel2=new JPanel();
panel3=new JPanel();
//在每个面板上放一个标签组件
panel1.add(new JLabel("选项卡1"));
panel2.add(new JLabel("选项卡2"));
panel3.add(new JLabel("选项卡3"));
//将三个面板分别放到选项卡面板中
tabbedPane.add("选项卡1",panel1);
tabbedPane.add("选项卡2",panel2);
tabbedPane.add("选项卡3",panel3);
//用选项卡面板代替窗口的内容窗格
this.setContentPane(tabbedPane);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
JTabbedPaneDemo frame=new JTabbedPaneDemo();
}
}
程序的运行界面如下图8所示。
在该程序中,我定义了JFrame类的一个子类JTabbedPaneDemo,在JTabbedPaneDemo中定义了一个选项卡面板tabbedPane和三个面板panel1,panel2和panel3,每个面板作为一个选项卡放到tabbedPane中,选项卡采用滚动布局方式,当窗口宽度较小时,会出现如下图所示的左右按钮和滚动条。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)