2009-7-29 1
Java程序设计
Programming in Java
雍俊海清华大学软件学院
School of Software,Tsinghua University
yongjunhai@tsinghua.org.cn
2009-7-29 2
Swing整体介绍
Swing GUI 组件
– 所在的包,javax.swing
– Swing组件的平台相关性较小 (lightweight)
早期版本的 GUI组件
– 所在的包,java.awt
– 与平台相关性较强
2009-7-29 3
JComponent
组件类的层次结构
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
JComponent——大多数 Swing组件类父类
2009-7-29 4
Swing 组件
容器
– 各种组件必须放在容器
– 容器本身也是一种组件
– 分类
顶层容器
其它容器
组件
– 基本控制组件
– 不可编辑的信息显示组件
– 可编辑的信息显示组件
2009-7-29 5
一些 GUI组件
标签 (JLabel)
文本框 (JTextField)
按钮 (JButton)
复选框 (JCheckBox)
组合框 (JComboBox)
文本 (JTextArea)
框架 (JFrame)
面板 (JPanel)
2009-7-29 6
框架 (JFrame)
类 JFrame 是 java.awt.Frame的子类
在 Swing的组件中,JFrame 并不全是由 Java编写的
– 是一种与平台关系比较密切的组件 (Heavyweight
component)
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--java.awt.Window
|
+--java.awt.Frame
|
+--javax.swing.JFrame
2009-7-29 7
构造方法
JFrame()
JFrame(String title)
创建方式
JFrame j=new JFrame();
JFrame j=new JFrame(“标题” );
2009-7-29 8
JFrame常用方法
setDefaultCloseOperation(int operation)
– operation常用参数:
JFrame,EXIT_ON_CLOSE (退出时候关闭 )
setSize(int w,int h):默认的大小为 0
setVisible(boolean):默认是不可见
setLocation(int,int);设置显示位置
Container getContentPane();得到内容面板
2009-7-29 9
Continue
setBackground(Color c)
– Color.red
– Color.blue
– new Color(int,int,int),取 0-255
如,new Color(255,255,0);
add(Component c);添加各部件
String getTitle();//得到 JFrame的标题
setBounds(int x,int y,int width,int height);//设置
Frame对象的大小和位置
2009-7-29 10
怎么添加组件到 JFrame
getContentPane()方法
然后给内容面版设置布局管理方式
setLayout(ManagerLayout m)
– null:不使用任何布局管理器
– add()方法添加某部件
– setBounds(int,int,int,int)方法决定组件位置和大小
2009-7-29 11
标签 (JLabel)
标签
– 为 GUI提供文本 (主要 )或图像 (也可以 )信息
– 对应类 (JLabel) (JComponent的子类 )
– 可以显示,
单行的只读的文本信息
图像
同时显示文本与图像信息
– 程序一般不修改标签的内容
2009-7-29 12
Continue
构造方法
– JLabel(String title)
– JLabel(Icon ic)
– JLabel(String title,Icon im,int HorizentalAlign)
主要方法
– String getText();
– void setText(String t);
2009-7-29 13
按钮 (JButton)
当鼠标左键单击按钮组件时,能触发特定的事件
在 Java中,广义的按钮包括,
– 命令式按钮 (JButton)
– 复选框 (JCheckBox)
– 单选按钮 (JRadioButton)
2009-7-29 14
按钮的构造方法
构造方法
– JButton(String text);
– JButton(String text,Icon ic);
– JButton(Icon ic);
2009-7-29 15
面板 (JPanel)
一种中间容器,用来组成其它组件
可以添加各种组件 (包括面板组件 )
– 面板 (JPanel)的大小由它所包含的组件决定
– 当组件个数增加,面板 (JPanel)也会随之而增大
2009-7-29 16
布局管理器
用来控制组件在容器中的布局方式
应当尽量利用已有的基本布局方式
布局管理器处理组件布局的大部分细节
2009-7-29 17
布局管理器
FlowLayout
BorderLayout
GridLayout
CardLayout
组合布局管理器
2009-7-29 18
FlowLayout
是一种最基本的布局管理器
javax.swing.JPanel的默认布局方式
在容器中,从左到右依次放置 GUI组件
当组件排到容器一行的末尾时,则从下一行开始接着排列组件
每行组件的对齐方式可以是,左对齐、中间 (默认对齐方式 )和右对齐
2009-7-29 19
类 FlowLayout 对齐方法
setAlignment( position_CONSTANT )
– FlowLayout.LEFT
– FlowLayout.CENTER
– FlowLayout.RIGHT
各组件的大小不随着窗口的大小改变而改变
2009-7-29 20
BorderLayout
是容器 JFrame和 JApplet的默认布局方式
将容器分成五个区域,
– NORTH (顶部 )
– SOUTH (底部 )
– WEST (左侧 )
– EAST (右侧 )
– CENTER (中间 )
每个区域最多只能 1个组件
2009-7-29 21
类 BorderLayout方法
构造方法,BorderLayout( hGap,vGap );
– hGap – 区域间的水平间隙
– vGap -区域间的竖直间隙
– 上面两个数据的默认值是 0
添加组件
– myContainer.add( component,position )
– component – 需要加入到容器中的组件
– positions – (BorderLayout.NORTH)
NORTH,SOUTH,EAST,WEST,CENTER
2009-7-29 22
Continue
四周的组件在厚度上不随着窗口的大小改变而改变,但长度会随着窗口的大小改变。
中间的组件会随着窗口的大小而改变
2009-7-29 23
GridLayout
构造方法
– GridLayout():1行 1列
– GridLayout(int rows,int cols):创建一个 rows行
cols列
– GridLayout(int rows,int cols,int hgap,int vgap):
创建一个 rows行,cols列,组件的水平和垂直距离分别为,hgap,vgap
组件随着窗口的大小而改变
2009-7-29 24
BoxLayout
BoxLayout(Container cn,int axis):创建一个
BoxLayout布局,cn表示布局的位置,
axis横向还是纵向。
2009-7-29 25
CardLayout
CardLayout的布局方式有点象码“扑克牌”
一个组件压在另一个组件的上面,所以每次一般只能看到一个组件
2009-7-29 26
布局管理器嵌套
实际上是容器的嵌套,被嵌套的容器可以具有不同的布局管理器
在嵌套的布局管理器中
– JPanel 通常起到了,桥,的作用
2009-7-29 27
文本框 (JTextField)
文本框 (JTextField)
– 显示单行的文本信息
– JTextField extends JTextComponent
2009-7-29 28
组合框 (JComboBox)
组合框 (JComboBox)
– 可以从下拉式的列表框中选取其中的列表项
– 有时也称为下拉框 (drop-down list)
类 JComboBox中的方法
– getSelectedIndex( )
返回当前被选中的项
– setMaximumRowCount( n )
设置最多显示列表项的项数
– 滚动条 (Scrollbar)会自动加上
2009-7-29 29
本章总体纲要
基本 GUI组件
布局管理器
事件处理模型
菜单
2009-7-29 30
事件处理模型
GUI是由事件 (event)驱动的
– 当用户与 GUI交互可以产生事件 (events)
– 一些常见的交互方式
移动鼠标
用鼠标点击按钮
在文本框中输入数据
关闭窗口等
2009-7-29 31
事件处理机制
主要涉及三种对象
– 事件源 (An event source)
– 事件对象 (An event object)
– 事件监听器 (event listener(s))
事件监听器 A
事件监听器 B
事件源
(例如,按钮 )
2009-7-29 32
事件处理机制
事件源
– 可供用户进行交互的 GUI组件
事件对象
– 封装了包含所发生的各种事件的有效信息
– 信息包括,事件源 的引用、以及 事件监听器 在处理事件时所需要的其它各种信息
– 事件信息被包含在类 AWTEvent或其子类的实例对象中
事件监听器
– 接受 事件对象,并处理事件对象
2009-7-29 33
处理鼠标事件
鼠标事件能够被 GUI组件捕获到
基本事件监听器的接口
– MouseListener
– MouseMotionListener
2009-7-29 34
事件适配器
事件适配器类 (Adapter)
– 只实现接口所需要处理的方法?通过覆盖
– 对于接口中的其它方法,系统会提供默认的方法 (方法体为空 )
事件适配器类 与 事件监听器接口 的区别?
– 利用事件适配器类,只需实现所需处理的方法
– 利用事件监听器接口,必须实现所有的方法
事件适配器类 与 事件监听器接口 的执行效率?
– 利用 事件适配器类 处理事件,并不能提高执行效率
2009-7-29 35
事件适配器类与事件监听器接口
ComponentAdapter
ContainerAdapter
FocusAdapter
MouseAdapter
WindowAdapter
KeyAdapter
MouseMotionAdapter
ContainerListener
FocusListener
MouseListener
WindowListener
KeyListener
MouseMotionListener
ComponentListener
事件适配器类 事件监听器接口
2009-7-29 36
本章总体纲要
基本 GUI组件
布局管理器
事件处理模型
菜单
2009-7-29 37
菜单
菜单可以使 GUI变得更为简洁
菜单只能加入到具有成员方法
(setJMenuBar)的类的实例对象中
– 例如,JFrame 和 JApplet
2009-7-29 38
菜单术语
菜单术语
– 菜单栏 (menu bar)
– 菜单 (menu)
– 菜单项 (menu item)
与菜单相关的部分类:
– JMenuBar
– JMenu
– JMenuItem
– JCheckBoxMenuItem (extends JMenuItem)
– JRadioButtonMenuItem (extends JMenuItem)
2009-7-29 39
编写具有菜单 (Menu)的程序
创建菜单栏,(menu bar)
– 给容器设置菜单栏,容器举例,JFrame、
JApplet
– setJMenuBar( myBar );
创建菜单
– 设置记忆符 (Mnemonic)
创建菜单项
– 设置记忆符 (Mnemonic)
– 类似于按钮,设置事件监听器,进行事件处理
2009-7-29 40
编写具有菜单 (Menu)的程序
将菜单项加入到适当的菜单中
– myMenu.add( myItem );
– 在菜单项间增加隔 (separator)?这不是必须的
myMenu.addSeparator();
如果需要子菜单,则将子菜单加入到菜单中
– myMenu.add( mySubMenu );
将菜单加入到菜单栏中
– myMenuBar.add( myMenu );
2009-7-29 41
记忆符 (Mnemonic)
一种触发菜单、子菜单或菜单项便捷方式
方法 setMnemonic
JMenu fileMenu = new JMenu( "File" )
fileMenu.setMnemonic( 'F' );
– 在键盘上,按下 Alt + F 来触发菜单、子菜单或菜单项
2009-7-29 42
弹出式菜单 (JPopupMenus)
弹出式菜单 ( JPopupMenus )
– 通过按鼠标键而弹出的浮动式菜单