实验七:基于Swing应用程序设计
一 实验目的
1、熟悉Swing的基本组件,包括多行文本输入框、带滚动面板和按钮等;
2、熟悉布局管理器
3、了解GUI图像用户界面的设计方法
4、掌握Java组件的事件处理机制
5、掌握图形用户界面程序与输入输出流的综合应用
二 实验原理
1、Swing组件
在javax.swing包中,定义了两种类型的组件:顶层容器(JFrame,JApplet,JDialog和JWindow)和轻量级组件。Swing组件都是AWT的Container类的直接子类和间接子类。类的层次结构如下:
java.awt.Component
-java.awt.Container
-java.awt.Window
-java.awt.Frame-javax.swing.JFrame
-javax.Dialog-javax.swing.JDialog
-javax.swing.JWindow
-java.awt.Applet-javax.swing.JApplet
-javax.swing.Box
-javax.swing.Jcomponet
组件从功能上分可分为:
1) 顶层容器:JFrame,JApplet,JDialog,JWindow共4个
2) 中间容器:JPanel,JScrollPane,JSplitPane,JToolBar
3) 特殊容器:在GUI上起特殊作用的中间层,如JInternalFrame,JLayeredPane,JRootPane.
4) 基本控件:实现人际交互的组件,如Jbutton, JComboBox, JList, JMenu, JSlider, JtextField。
5) 不可编辑信息的显示:向用户显示不可编辑信息的组件,例如JLabel, JProgressBar, ToolTip。
6) 可编辑信息的显示:向用户显示能被编辑的格式化信息的组件,如JColorChooser, JFileChoose, JFileChooser, Jtable, JtextArea。
Swing是AWT的扩展,它提供了许多新的图形界面组件。Swing组件以"J"开头,常见的组件有按钮(JButton)、文本框(JTextField)、下列框(JComboBox)标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等,还增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。
2、布局管理器
Java通过布局管理器对所有构件进行管理,以支持跨平台的动态布局效果。常见布局管理器有5种,见表1所示。
表1 常见布局管理器及特点
布局 |
特点 |
FlowLayout布局 |
组件按照加入的先后顺序从左到右排放,放不下再换至下一行,部件大小不变,是Applet和Panel的默认布局。 |
BorderLayout布局 |
将容器分为东(East)、南(South)、西(West)、北(North)、中(Center)五个区域,加入组件用命令:add(方位名字符串, 组件)。是Frame、Dialog的默认布局。 |
GridLayout布局 |
将容器空间分为若干行乘若干列的网格区域,组件按从左向右,从上到下的次序被加到各单元格中,组件的大小将调整为与单元格大小相同。 |
CardLayout布局 |
将组件叠成卡片的形式,每个组件占用一块卡片,通过卡片的翻动选择要显示的组件。 |
GridBagLayout布局 |
在GridLayout的基础上发展而来,将整个容器分成若干行、列组成的单元,但各行可以有不同的高度,每栏也可以有不同的宽度,一个部件可以占用一个、也可以占用多个单元格。 |
3、Swing图形用户界面设计流程
Swing的程序设计一般可按照下列流程进行:
1) 引入Swing包
2) 选择"外观和感觉"
3) 设置顶层容器
4) 设置按钮和标签
5) 向容器中添加组件
6) 在组件周围添加边界
7) 进行事件处理
4、事件处理
(1) 事件处理机制
l 涉及对象有事件源、事件、事件处理者(监听者)。事件源是发生事件的对象;事件对象是提供事件相关信息的对象;事件处理者则是消化事件,完成特定处理的对象。
l Java采用委托(授权)事件处理机制;事件源对其可能发生的事件分别授权不同的事件处理者处理;通过如下命令注册监听者:
addXXXListener(XXXListener a);
其中,XXX与相应事件类型相关,例如:按钮点击动作事件对应标记为“Action”.
要注销监听者使用removeXXXListener(XXXListener a);
l 事件处理者必须实现某类事件相对应的接口,只有符合接口规范的对象才能作为事件处理者,通过编写相应方法实现事件的处理。
例如,ActionListener接口中定义了如下方法用来处理事件。
public void actionPerformed(ActionEvent e);
l Java为每类事件提供了一个相应的接口。
(2) 事件与事件处理
l java.util.EventObject是所有事件类的父类;java.awt.AWTEvent是所有AWT事件类的父类,其包括低级事件和基于语义的高级事件。
l XXXEvent对应的事件处理接口通常为XXXListener,常见接口的事件处理方法见表2。
表2事件接口及处理方法
描述信息 |
接口名称 |
方法(事件) |
点击按钮、点击菜单项、文本框按回车等动作 |
ActionListener |
actionPerformed(ActionEvent) |
选择了可选项的项目 |
ItemListener |
itemStateChanged(ItemEvent) |
窗口事件 |
WindowListener |
windowClosing(WindowEvent) windowOpened(WindowEvent) windowIconified(WindowEvent) windowDeiconified (WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) |
l 事件适配器
Java中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法,程序员设计可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。
l 在事件处理代码中区分事件源
在事件处理代码中可通过相应的方法得到事件源对象或与事件源相关的信息,见表3,通过这些信息可区分事件源。
表3 在事件处理代码中区分事件源
事件类型 |
方法 |
作用 |
ActionEvent |
getSource() |
返回事件对象对应的事件源对象 |
getActionCommand() |
返回动作命令字符串 |
|
WindowEvent |
getWindow() |
返回窗体事件对应的窗体对象 |
ItemEvent |
getItemSelectable() |
返回选择事件对应的事件源对象 |
KeyEvent |
getKeyChar() |
返回键盘事件按键对应的字符 |
getKeyCode() |
返回键盘事件所按键的编码值 |
5、读写文件
(1)面向字节的文件访问
l 以二进制文件作为数据源。FileInputStream类和FileOutputStream类分别用于文件的读、写访问。
l 利用InputStream和OutputStream的方法可实现文件的读写操作。
l 可用DataInputStream对FileInputStream流进行过滤;用DataOuputStream对FileOutputStream流进行过滤,以实现特定数据类型数据的读写。
(2)面向字符的文件访问
l 以字符文件作为数据源。包括:FileReader类和FileWriter类分别用于字符文件的读、写访问。
l 基于字符流的数据读写方法与基于字节流的类似,只是将读写的单位由字节改为字符,方法中的字节数组参数相应改为字符数组。例如:
int read(char b[])表示从文件读数据填满数组,返回读到的字符数。
l 可用BufferedReader对FileReader流进行过滤;用BufferedWriter对FileWriter流进行过滤,其中包含newLine()方法可写入一个换行。
三 实验环境
1、JDK1.6 for windows
2、Eclipse3.3或JCreator4.0
3、JDK API 6
4、PC机配置要求:
CPU |
最低CR 1GHz,建议P4 2.0以上 |
内存 |
最低256M,建议512M以上 |
硬盘容量 |
10G以上 |
操作系统 |
Windows 2000 系列、Windows XP 系列 |
四 实验内容和步骤
1、实验内容
使用Swing编写一个支持中文文本编辑程序TextEdit.java,要求如下:
① 用户界面大小为400×200像素,如下图所示:
② 程序启动后,多行文本输入框TextArea中显示当前目录下myText.txt文件中原有的内容,如果该文件不存在,则新建该文件。
③ “保存”按钮功能:将多行文本输入框JTextArea中的内容写入myText.txt文件中保存。
④ “取消”按钮功能:将多行文本输入框JTextArea中的内容清空。
⑤ “退出”按钮功能:退出程序
2、实验步骤
(1) 加载组件和事件处理以及输入输出流的包:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
(2)声明文本编辑程序的类,并继承顶层容器JFrame,实现事件处理的接口:
class TextEdit extends JFrame implements ActionListener
(3)定义用户登录界面的组件,包括文本框JTextArea、三个按钮JButton以及读写文件名等:
JTextArea text;
JButton save,cancel,exit;
String fileName="myText.txt";
(4)定义构造方法,实例化各组件,实现文本编辑程序的界面布局:
public TextEdit(){
setTitle("文本编辑器");
text=new JTextArea();
text.setLineWrap(true);
text.setWrapStyleWord(true);
JScrollPane area=new JScrollPane(text);
text.setText(readFile(fileName));
save=new JButton(" 保 存 ");
cancel=new JButton(" 取 消 ");
exit=new JButton(" 退 出 ");
JPanel p1=new JPanel();
p1.add(save);
p1.add(cancel);
p1.add(exit);
getContentPane().add(area,BorderLayout.CENTER);
getContentPane().add(p1,BorderLayout.SOUTH);
setSize(400,200);
setVisible(true);
}
(5)对下拉框和三个按钮注册事件监听
save.addActionListener(this);
cancel.addActionListener(this);
exit.addActionListener(this);
(6)实现按钮事件监听器接口的方法
public void actionPerformed(ActionEvent e){
if(e.getSource()==save){
try{
//将文本框的内容保存写入文件中
}
else if(e.getSource()==cancel){
//清空文本框的内容
}
else if(e.getSource()==exit){
//退出程序
}
}
(7)读取文本文件的内容,并将内容返回
public String readFile(String fileName){
//读取文本文件fileName的内容,并将内容返回
}
(8)实现main方法,测试用户登录程序
public static void main(String args[]){
new TextEdit();
}
练习
1、基于swing,综合使用布局管理器创建并显示一个基本型的计算器界面。类的名称为MyCalculator。界面样式参考Windows中的计算器,但不需要菜单,也不需要实现事件响应。
2、基于swing,设计一个类似于Windows中的记事本程序。要求有“文件”和“帮助”菜单。文件菜单中含有“新建”、“打开”、“保存”、“另存为”、“退出”几个菜单项。帮助菜单中有一个“关于”菜单项。请实现所有的菜单功能。打开或保存文件时使用JFileChooser类。仅能够打开或保存为.txt文件。
五 实验报告要求
①实验名称
②实验内容说明
③程序源代码
④实验步骤,实验中出现的问题,观察到的结果
⑤实验总结
http://www.wsncs.zjut.edu.cn/java2010/Artical.asp?ID=122