(一)概念
Swing是一个用于开发Java图形界面应用程序的开发工具包.是以AWT为基础.
AWT是抽象窗口工具集,是用来开发图形程序的基础.Swing是对AWT的基础上进行了修改和升级等等.
(二)Swing组件
1.概述与细分
显示效果划分:Swing组件分为两种类型:
JComponent类:包括了一些不能独立显示的组件
Window类: 主要包括一些可以独立显示的组件
可独立组件定义: 运行一个程序时,这个组件无须托付在其他组件上就可以显示.(即它可以直接显示出来)
不可独立显示定义:必须依赖可独立显示组件来显示,比如:文本框组件,按钮组件必须要依托在Jframe框架组件上才能显示出来.
功能上划分:
顶层组件: 又称为顶层容器
顶层容器也可以说是Window组件,是可以独立显示的组件.在实际开发中,一般都是将他们作为一个图形界面的最顶层
JFrame 用来设计类似于Windows系统中的窗口形式的应用程序
JDialog 用来设计对话框的
JApplet 用来设计可以嵌入在网页中的Java小程序
JWindow
中间组件: 分为中间容器和特殊中间组件
JPanel,JScrollPane, JSplitPane , JToolBal
中间容器指那些可以充当载体,但也是不可独立显示的组件,通俗讲就是一些基本空间可以放在其中,但是不能独立显示,必须要依托在顶层容器内才可以.
特殊容器: 在GUI上起特殊的作用的中间层,比如JInternalFrame,JLayeredPane,JRootPane
特殊容器类其实也是中间容器类的一种,只不过它在图形上更加能够起到美化和专业化的作用.
基本组件:
实现人机交互的组件 比如 JButton JComboBox JList JMenu JSlider JTextField
基本组件指那些只能依赖在中间容器才能被显示的组件,不能独立存在.
在实际开发中,绝大多数Java程序是使用JFrame组件对象作为该程序的顶层容器,当然JDialog和JApplet也可以作为顶层窗口,只不过JDialog一般作为弹出窗口来使用,而JApplet一般作为嵌在网页中的小程序的框架来使用.大多数图形界面的顶层容器仍然使用JFrame作为程序框架.
以上图形示意图,可以联系到实际开发中设计一个图形界面的方法,其方法就是首先创建一个顶层容器JFrame,接下来创建一个内容面板或者中间容器,也可以创建一个菜单组件,最后将所需要的基本组件按照一定的布局方式添加到内容面板中,这样就形成了一个图形界面.
2.在顶层容器中添加组件
Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(ContentPane)上,内容面板其实就是一个中间容器,它是一个轻量级组件
基本规则:
1. 把Swing组件放入一个与顶层Swing容器相关联的内容面板上,
2. 避免使用非Swing的重量级组件
添加中间组件和基本组件两种方式:
getContentPane()方法获取JFrame内容面板,再在这个内容面板中添加组件,方法为frame.getContentPane().add(childComponent).
另一种方法: 先建立一个JPanel或JDesktopPane之类的中间容器,把组件添加到容器中,然后再用setContentPane()方法把该容器置为,JFrame的内容面板.
3.JFrame
JFrame默认面板是JRootPane
JFrame默认布局管理器是BorderLayout
frame.setContentPane(jp);是把jp设置为内容面板。
frame.getContentPane.add(jp,BorderLayout.CENTER);是获取默认的内容面板。
jFrame.setBounds(x,y,width,height)
setBounds 相当于setLocation()和setSize()方法的综合.在实际使用,需要将容器的layout设置为null.因为使用布局管理器时,控件的位置与尺寸是由布局管理器来分配的,需要注意的是,这时必须手动指定容器的尺寸,因为空的布局管理器会将容器自身的PreferredSize清零,导致容器无法在GUI上显示。因此,如果容器在上级容器中使用布局管理器排列,那么需使用setPreferredSize(),如果容器在上级容器中仍然手动排列,那么对容器使用setBounds()即可。
设置位置的,x是横向的
setPreferredSize和setSize区别
1.setPreferredSize需要在使用布局管理器的时候使用,布局管理器会获取空间的preferredsize,因而可以生效。例如borderlayout在north中放入一个panel,panel的高度可以通过这样实现:panel.setPreferredSize(new Dimension(0, 100));这样就设置了一个高度为100的panel,宽度随窗口变化。
2.setSize,setLocation,setBounds方法需要在不使用布局管理器的时候使用,也就是setLayout(null)的时候可以使用这三个方法控制布局。
区分好这两个不同点之后,我相信你的布局会更随心所欲。
setLocation()方法
将组建移动到新的位置, 参数x是横向(左右),y是纵向(上下)
setLayout会覆盖setLocation行为,setLocation()不能保证跨平台的界面一致性
(三)轻量级组件JComponent
JComponent类是所有轻量级组件的父类.
所有继承JComponent类的组件都属于基本组件类,它们只能依赖于中间容器而存在.
1.常用子类
JButton 按钮, 可以带图标
JTree 树
JComboBox 组合框
JCheckBox 复选框
JFileChooser 文件选择器
JInternalFrame 内部窗体
JLabel 标签
JMenu 菜单对象
JMenuBar 菜单条
JPanel 面板
JPasswordField 密码文本框
JPopupMenu 弹出式菜单
JProgressBar 进程条
JScrollBar 滚动条
JTextArea 文本区
JTable 表格
JSplitPane 拆分窗格
JToolTip 工具提示
JToolBar 工具条
JTextPane 文本窗格
JRadioButton 单选按钮
JScrollPane 滚动窗格
JSlider 滚动条
2.特性
(四)标签和按钮组件
1.普通按钮
普通按钮的使用很简单,而在实际开发中最关键就是对按钮组件进行事件监听.
JButton , 注意不要用 Button,因为有乱码产生
2.单选按钮
JRadioButton
setEnabled(boolean b) 启用或禁用组件
boolean isSelected() 判断按钮是否是选中状态
3.添加复选框
4.总结
在顶层窗口中添加标签:只需要将标签空间添加到顶层窗口的内容面板上即可,至于标准妞们上的文字,可以使用构造器和setText()两种方法来创建.
普通按钮空间的添加:只须将按钮控件添加到顶层窗口的内容面板上即可,至于俺就上的文字,可以使用构造器来创建
单选按钮控件的添加:只须将按钮控件添加到顶层窗口的内容面板上即可,至于按钮旁边的文字,可以使用构造器来创建,另外如果要实现单选的目的,就需要将单选的一批按钮划分到按钮组中
复选按钮控件的添加:只须将按钮控件添加到顶层窗口的内容面板上即可,至于按钮旁边的文字,可以使用构造器来创建
布局管理器组件
1.基本概念
顶层窗口控件排列的不是很令人满意,原因就是没有对顶层容器进行布局管理,
不同的布局管理方式对应不同的风格的布局格调,在设计软件的时候,必须要根据用户的要求,选择不同的风格的布局管理器.
所有的容器都会使用一个布局管理器,通过它来自动进行组件的布局管理.
Swing采用了布局管理器来管理组件的排放,位置,大小等布置任务,Swing虽然有顶层容器,但是不能把组件直接加到顶层容器中,Swing窗体中含有一个称为内容面板的容器(ContentPane),可以说是中间容器.为容器内的组件提供了若干布局策略.每个容器都有某种默认的布局管理器,用于负责其内部组件的排列,布局管理器能够将各个组件在顶层容器内排列的井井有条.
(二)流式布局管理器(FlowLayout)
是Jpanel和JApplet默认布局管理器
按照控件加入的先后顺序从左到右排列,一行排满了再换下一行,然后继续从左到右排序.每一行的组件都是居中排列的. 如果有些按钮看不到,可以使用方法pack自动调整Frame大小.使得所有控件都显示出来.
FloeLayout可以选择以左对齐、居中对齐、以右对齐的方式排列组件。
流式布局(FlowLayout)—注意事项
1、不限制他所管理的组件的大小,允许他们有最佳大小
2、当容器被缩放时,组件的位置可能变化,但是组件的大小不变
3、默认组件是居中对齐,可以通过FlowLayout(intalign)函数来指定对齐方式
(三)网格布局管理器(GridLayout)
它将区域分割成行数(rows)和列数(columns)的网格状布局,组件按照由左至右、由上而下的次序排列填充到各个单元格中。
添加到容器中的组件首先放置在左上角的网格中,然后从左到右放置其他的组件,当占满该行的所有网格后,接着继续在下一行从左至右放置组件。
(四)卡片布局管理器(CardLayout)
将容器中每一个组当做一个卡片,一次仅有一个卡片可见,最初显示容器时,CardLayout对象的第一个组可见,其它组件不可见.
(五)网格包布局管理器(GridBagLayout)
1.基本使用
是在网格基础上提供复杂的布局,是最灵活、最复杂的布局管理器。GridBagLayout 不需要组件的尺寸一致,允许组件扩展到多行多列。每个 GridBagLayout 对象都维护了一组动态的矩形网格单元,每个组件占一个或多个单元,所占有的网格单元称为组件的显示区域。
与GridLayout布局管理器不同的是,GridBayLayout是按照开发人员自己的思路来排列控件位置,而GridLayout布局管理器根据系统的安排来布局,
网格组由多个网格组成,而且各个行或者列的长度和宽度不同,但是默认情况下,单元格从左上角开始有序列的编号,从第0行,第0列开始计算.
当向网格组布局管理器添加组件时,需要分别定义每个单元格的序列号,只要设定相应的值,那么组件就好添加到网格组布局管理器中.
涉及到组件添加什么位置的有四个参数:
1. gridx 和 gridy
用来指定组件左上角在网格中的行和列。容器中最左边列的 gridx 为 0,最上边行的 gridy 为 0。这两个变量的默认值是 GridBagConstraints.RELATIVE,表示对应的组件将放在前一个组件的右边或下面。
2. gridwidth 和 gridheight
用来指定组件显示区域所占的列数和行数,以网格单元而不是像素为单位,默认值为 1。
网格组布局管理器中每个区域都有设置增量字段(widthx 与widthY),分别代表x方向和y方向的增量
如果想让某个区域保持初始化的大小,也就是窗口缩放不会引起组件缩放,就应该设置该区域的增量为0,如果让组件能随时完全填充单元格,增量自动就应该设置为100
布局管理器还涉及到两个参数
fill
当组件不能填满单元格时,fill参数可以发挥作用,
anchor
当一个组件大于分配给它的单元格时发挥作用,该约束就是约定如何处理该组件.
2.GridBagConstraints
布局模式 :GridBagConstraints布局,先发一个实例:gridx = 2; // X2
gridy = 0; // Y0
gridwidth = 1; // 横占一个单元格gridheight = 1; // 列占一个单元格weightx = 0.0; // 当窗口放大时,长度不变weighty = 0.0; // 当窗口放大时,高度不变anchor = GridBagConstraints.NORTH; // 当组件没有空间大时,使组件处在北部
fill = GridBagConstraints.BOTH; // 当格子有剩余空间时,填充空间
insert = new Insets(0, 0, 0, 0); // 组件彼此的间距ipadx = 0; // 组件内部填充空间,即给组件的最小宽度添加多大的空间ipady = 0; // 组件内部填充空间,即给组件的最小高度添加多大的空间new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insert, ipadx, ipady);
(六)边界布局管理器(BorderLayout)
BorderLayout(边框布局管理器)是 Window、JFrame 和 JDialog 的默认布局管理器。边框布局管理器将窗口分为 5 个区域:North、South、East、West 和 Center。其中,North 表示北,将占据面板的上方;Soufe 表示南,将占据面板的下方;East表示东,将占据面板的右侧;West 表示西,将占据面板的左侧;中间区域 Center 是在东、南、西、北都填满后剩下的区域,如图 1 所示。
提示:边框布局管理器并不要求所有区域都必须有组件,如果四周的区域(North、South、East 和 West 区域)没有组件,则由 Center 区域去补充。如果单个区域中添加的不只一个组件,那么后来添加的组件将覆盖原来的组件,所以,区域中只显示最后添加的一个组件。
是简单的布局策略,分为五个区域,东(East)南(South)西(West)北(North)中(Center)
(七)箱式布局(BoxLayout)
提示:使用盒式布局可以像使用流式布局一样简单地将组件安排在一个容器内。包含盒式布局的容器可以嵌套使用,最终达到类似于无序网格布局那样的效果,却不像使用无序网格布局那样麻烦。
有两种,一种是水平箱,一种是垂直箱
水平箱是按照从左到右顺序排列,垂直箱是按照从上到下的顺序排列.
对于箱式布局管理器而言,最关键的是每个组件的3个尺寸:
首选尺寸: 即组件显示时的宽度和高度
最大尺寸:即组件能被显示的最大宽度和高度.
最小尺寸:即组件被显示的最小高度和最小宽度.
(八)(弹簧布局)SpringLayout
弹性布局管理器。使用该布局的容器内的 每一个组件或容器都对应着一个约束,通过该约束定义组件或容器四条边的坐标位置 来实现对组件的布局。该布局主要涉及三个类: SpringLayout、SpringLayout.Constraints、Spring,分别表示 布局管理器、约束、坐标距离。
通过方法 putConstraint(String e1, Component c1, int pad, String e2, Component c2)可以为各个边之间建立约束
e1:需要参考的组件对象的具体需要参考的边
c1:需要参考的组件对象
pad:两条边之间的距离(两个组件的间距)
e2:被参考的组件对象的具体被参考的边
c2:被参考的组件对象(也可以是需要参考的组件对象所属的容器对象)
(注意:当e2在e1的北侧或西侧的时,pad应为正数;当e2在e1的南侧或东侧的时,pad应为负数)
e1和e2的静态常量:EAST(组件东侧的边)、WEST(组件西侧的边)、NORTH(组件北侧的边)、SOUTH(组件南侧的边)
在布局的时候,经常会使用到下面的方法
Void putConstraint(String e1 ,Component c1 ,int pad ,String e2,Component c2)
上述方法用于将组件 c1 的边 e1 连接到组件 c2 的边 e2,边与边之间的距离为pad.
通过定义组件的边沿距离来实现布局的,边界之间的距离是使用Spring对象来表示的,每个SpringLayout有4个属性,包括:
minimum 最小值
maximum 最大值
preferred 首选的
value 值
其中value表示的是真实的值.
这个布局管理器,设计到如下几个常量
EAST : 指定组件的边界矩形的右边.
NORTH : 指定组件的边界矩形的顶边,
SOUTH: 指定组件的边界矩形的底边
WEST: 指定组件的边界矩形的左边
(九)分组布局(GroupLayout)
以Group(组)为单位来管理布局,也就是把多个组件(如:JLable ,JButton)按区域划分到不同的Group(组),再根据各个Group(组)相对于水平轴(Horizontal)和垂直轴(Vertical)的排列方式来管理.
GroupLayout支持两种组:
串行组 (sequential group) 按顺序一个接一个地放置其子元素
并行组 (parallel group) 能够以四种方式对齐其子元素。
创建 串行组(按顺序一个接一个地放置其子元素):
GroupLayout.SequentialGroup hsg = groupLayout.createSequentialGroup();
创建 并行组(能够以四种方式对齐其子元素):
GroupLayout.ParallelGroup hpg = groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER);
面板组件
1.概念
面板其实就是一个容器,也就是前面说的中间容器类,它可以将基本组件放置在其中,组成丰富多彩的用户界面.
(二)使用
1.JPanel
JPanel是实际开发项目中使用频率最高的面板之一.
双缓冲,意义就是通过使用双缓冲技术改进频繁变化的组件的显示效果.JPanel布局管理器默认是FlowLayout.
2.JScrollPane
JScrollPane类是一个带滚动条的容器类,它可以用来显示一些文本,表格等内容,当内容超过JScrollPane面板大小时,程序会自动添加滚动条.
一般显示大量的文本文件可能会用到JScrollPane
3.JSplitPane
JSplitPane面板主要是用来讲不同的组件分隔开来.
在实际开发中,纯色JSplitPane面板的频率非常高,经常用来在一个窗口中显示出两种不同风格的格式,
4.JTabbedPane
5.JInternalFrame
使用与JFrame几乎一样,如最大化,最小化,关闭窗口或者加入菜单等,唯一不同的是JInternalFrame是中间容器类,也就说说JInternalFrame不能单独出现,必须依附在最上层组件中.
用法上 JInternalFrame面板和JPanel几乎是相同的,唯一不同的是 JInternalFrame可以关闭,最大化,最小化,
6.JLayeredPane
JLayeredPane面板主要是为JFC,Swing容器添加深度,它允许组件在必要的时候互相重叠.
7.JRootPane
JFrame默认面板是JRootPane
JRootPane面板是由许多部分组成的,它可以直接从顶层容器中获取一个JRootPane对象来直接使用,而不需要新建一个对象,
JRootPane包括GlassPane和LayeredPane,而LayeredPane又包括了ContentPane和JMenuBar
GlassPane在默认状态下是隐藏的,如果设置为true就是可见的了,它会像玻璃一样覆盖在整个JRootPane对象上面,而LayeredPane分成很多层,一般所有的组件都会添加到ContentPane上,JmenuBar可以存在也可以不存在.
事件处理机制
1.概念
事件处理就是如何处理用户软件中的事件.
事件:指的是像敲键盘,单击鼠标,双击鼠标,在文本输入区域内获取输入交单,单击按钮控件,单击选项卡控件,单击树组件等.这些事件的发生必须要处理,当单击按钮控件后发生什么样的事情.而这个事情就是Swing通过代码编写出来的.
(二)适配器类
1.基本分类
2.窗口事件的处理
窗口事件只针对在窗口对象上发生的事情,它在用户打开,关闭,最小化,最大化窗口时发生.处理窗口的事件的接口是WindowListener接口.
3.动作事件的处理
动作事件主要针对组件,
什么是动作事件? 比如单击按钮,选择菜单,在文本框中输入字符串并且按Enter键,都属于动作事件.
动作事件监听接口是ActionListener接口
4.焦点事件的处理
如果在用户程序界面上有多个组件,但是每次只能操作一个组件,也就说是每次操作的焦点只能停留在一个组件上,基本上所有的组件都能产生焦点事件.
(三)列表框和下拉列表框组件
实例化一个列表框
String[] s1 = {“美国”, “日本”, “大陆”, “英国”, “法国”, “意大利”, “澳洲”, “韩国”};
JList
/ 设置程序一打开时所能看到的数据项个数。/
list.setVisibleRowCount(5);
/设置列表框的标题/
list.setBorder(BorderFactory.createTitledBorder(“您最喜欢到哪个国家玩呢?”));
1.列表框选取事件的处理
JList类中有addListSelectionListener()方法可以检测用户是否对JList的选取有任何的改变,
2.列表框双击事件的处理
如何处理在JList上双击鼠标的操作,使用JList类提供的LocatToindex()方法获知.
3.下拉列表框JComboBox
String[] s = {“桃花”, “梅花”, “玫瑰”, “牡丹”, “月季”, “茉莉”, “菊花”};
/构造方式添加值/
JComboBox combo1 = new JComboBox(s);
/additem 添加item到 JComboBox 容器里面/
combo1.addItem(“映山红”);
combo1.addItem(“樱花”);