接下去继续给大家介绍这个地址薄程序我们要做的如下:
1.创建一个用户界面
2.向文件中添加一条记录
3.从文件中读取一条记录
4.编程实现按钮的功能
代码如下:
package chapter18;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class AddressBook extends JFrame {
// Specify the size of five string fields in the record
final static int NAME_SIZE = 32;
final static int STREET_SIZE = 32;
final static int CITY_SIZE = 20;
final static int STATE_SIZE = 2;
final static int ZIP_SIZE = 5;
final static int RECORD_SIZE =
(NAME_SIZE + STREET_SIZE + CITY_SIZE + STATE_SIZE + ZIP_SIZE);
// Access address.dat using RandomAccessFile
private RandomAccessFile raf;
// Text fields
private JTextField jtfName = new JTextField(NAME_SIZE);
private JTextField jtfStreet = new JTextField(STREET_SIZE);
private JTextField jtfCity = new JTextField(CITY_SIZE);
private JTextField jtfState = new JTextField(ZIP_SIZE);
private JTextField jtfZip = new JTextField(ZIP_SIZE);
// Buttons
private JButton jbtAdd = new JButton("Add");
private JButton jbtFirst = new JButton("First");
private JButton jbtNext = new JButton("Next");
private JButton jbtPrevious = new JButton("Previous");
private JButton jbtLast = new JButton("Last");
public AddressBook() {
// Open or create a random access file
try {
raf = new RandomAccessFile("address.dat", "rw");
}
catch(IOException ex) {
System.out.print("Error: " + ex);
System.exit(0);
}
// Panel p1 for holding labels Name, Street, and City
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(3, 1));
p1.add(new JLabel("Name"));
p1.add(new JLabel("Street"));
p1.add(new JLabel("City"));
// Panel jpState for holding state
JPanel jpState = new JPanel();
jpState.setLayout(new BorderLayout());
jpState.add(new JLabel("State"), BorderLayout.WEST);
jpState.add(jtfState, BorderLayout.CENTER);
// Panel jpZip for holding zip
JPanel jpZip = new JPanel();
jpZip.setLayout(new BorderLayout());
jpZip.add(new JLabel("Zip"), BorderLayout.WEST);
jpZip.add(jtfZip, BorderLayout.CENTER);
// Panel p2 for holding jpState and jpZip
JPanel p2 = new JPanel();
p2.setLayout(new BorderLayout());
p2.add(jpState, BorderLayout.WEST);
p2.add(jpZip, BorderLayout.CENTER);
// Panel p3 for holding jtfCity and p2
JPanel p3 = new JPanel();
p3.setLayout(new BorderLayout());
p3.add(jtfCity, BorderLayout.CENTER);
p3.add(p2, BorderLayout.EAST);
// Panel p4 for holding jtfName, jtfStreet, and p3
JPanel p4 = new JPanel();
p4.setLayout(new GridLayout(3, 1));
p4.add(jtfName);
p4.add(jtfStreet);
p4.add(p3);
// Place p1 and p4 into jpAddress
JPanel jpAddress = new JPanel(new BorderLayout());
jpAddress.add(p1, BorderLayout.WEST);
jpAddress.add(p4, BorderLayout.CENTER);
// Set the panel with line border
jpAddress.setBorder(new BevelBorder(BevelBorder.RAISED));
// Add buttons to a panel
JPanel jpButton = new JPanel();
jpButton.add(jbtAdd);
jpButton.add(jbtFirst);
jpButton.add(jbtNext);
jpButton.add(jbtPrevious);
jpButton.add(jbtLast);
// Add jpAddress and jpButton to the frame
add(jpAddress, BorderLayout.CENTER);
add(jpButton, BorderLayout.SOUTH);
jbtAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
writeAddress();
}
});
jbtFirst.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
if (raf.length() > 0) readAddress(0);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
});
jbtNext.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
long currentPosition = raf.getFilePointer();
if (currentPosition < raf.length())
readAddress(currentPosition);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
});
jbtPrevious.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
long currentPosition = raf.getFilePointer();
if (currentPosition - 2 * RECORD_SIZE > 0)
// Why 2 * 2 * RECORD_SIZE? See the follow-up remarks
readAddress(currentPosition - 2 * 2 * RECORD_SIZE);
else
readAddress(0);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
});
jbtLast.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
long lastPosition = raf.length();
if (lastPosition > 0)
// Why 2 * RECORD_SIZE? See the follow-up remarks
readAddress(lastPosition - 2 * RECORD_SIZE);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
});
// Display the first record if exists
try {
if (raf.length() > 0) readAddress(0);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
/** Write a record at the end of the file */
public void writeAddress() {
try {
raf.seek(raf.length());
FixedLengthStringIO.writeFixedLengthString(
jtfName.getText(), NAME_SIZE, raf);
FixedLengthStringIO.writeFixedLengthString(
jtfStreet.getText(), STREET_SIZE, raf);
FixedLengthStringIO.writeFixedLengthString(
jtfCity.getText(), CITY_SIZE, raf);
FixedLengthStringIO.writeFixedLengthString(
jtfState.getText(), STATE_SIZE, raf);
FixedLengthStringIO.writeFixedLengthString(
jtfZip.getText(), ZIP_SIZE, raf);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
/** Read a record at the specified position */
public void readAddress(long position) throws IOException {
raf.seek(position);
String name = FixedLengthStringIO.readFixedLengthString(
NAME_SIZE, raf);
String street = FixedLengthStringIO.readFixedLengthString(
STREET_SIZE, raf);
String city = FixedLengthStringIO.readFixedLengthString(
CITY_SIZE, raf);
String state = FixedLengthStringIO.readFixedLengthString(
STATE_SIZE, raf);
String zip = FixedLengthStringIO.readFixedLengthString(
ZIP_SIZE, raf);
jtfName.setText(name);
jtfStreet.setText(street);
jtfCity.setText(city);
jtfState.setText(state);
jtfZip.setText(zip);
}
public static void main(String[] args) {
AddressBook frame = new AddressBook();
frame.pack();
frame.setTitle("AddressBook");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
如果这个文件address.dat不存在,则创建名为address.dat的随机读写文件来存储地址信息。如果它已经存在,则打开它。随机文件对象raf用于实现文件的读写操作。记录中每个域的长度都是固定的
44——100行创建用户界面,第102——156行注册监听器,在第159——164行程序开始运行后,如果存在记录,则显示第一条记录。
writeAddress()方法将文件指针设置到文件的尾(170行),并向文件中写入新纪录(第171——180行)
readAddress()方法将指针设置到指定位置(189行)并从文件中读取一条记录(190——199行)
要向文件中添加记录,需要从用户界面中收集地址信息,在写到文件之中去
处理按事件的代码第102——156行实现。Firs按钮读取文件中0的位置的记录(110行)Next按钮读取当前文件指针所指的记录(122行)读取一条记录后,文件指针从上一个位置向前移动2*RECORD_SIZE个字节。对previous按钮,需要显示当前正在显示的记录的前一条,所以,必须将当前文件指针向后移动两条记录(135行)Last按钮读取raf.length()-2*RECORD_SIZE位置的记录
再给大家截图看看效果
- 大小: 5.6 KB
- 大小: 6.6 KB
分享到:
相关推荐
这份"java小记.rar"压缩包很可能包含了作者多年从事Java Web开发的经验总结,可能包括代码示例、笔记、最佳实践等内容。 在Java Web开发中,Servlet是核心部分,它是一个Java类,用于扩展服务器的功能,处理HTTP...
GeoStudio学习小记
在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...
本章节将重点围绕104规约的学习小记,包括固定长度报文的基本结构、常见帧的类型、报文示例及总召唤命令等几个方面进行详细解析。 #### 二、固定长度报文 固定长度报文是104规约中的一种基本报文形式,其结构相对...
### D3.js 学习小记 #### SVG基础与D3.js绘图实践 ##### SVG基础 SVG(可缩放矢量图形)是一种基于XML的矢量图像格式,用于描述二维图形以及图形应用。SVG 图像可以被放大、缩小而不会失真,非常适合于网页制作。...
时间和日期中常用到的几个类: java.util.Date, java.util.Calendar, java.util.GregorainCalendar, java.text.DateFormat, java.text.SimpleDateFormat
《VC学习小记》 学习Visual C++,也就是VC,是一项技术性强且深入的工程,尤其对于初学者来说,需要有良好的C/C++基础作为支撑。C++的基础知识包括语法、面向对象编程概念以及模板等高级特性,这些都是使用MFC...
【LocalCache 学习小记1】 LocalCache 是一种本地高速缓存机制,它主要用于提升数据获取速度,尤其是在处理大量数据时,可以有效避免频繁访问远程数据库或分布式缓存,如 Redis 中的热键问题。LocalCache 不是...
Redis是一款高性能的键值存储系统,常用于缓存和数据库应用。本文主要探讨Redis的安全问题,包括连接方式、数据加密、认证机制、数据备份以及主从复制等方面。 首先,Redis的默认配置可能存在安全风险,例如它允许...
标题 "SQL学习小记" 暗示了这篇博客文章主要关注的是SQL语言的学习和实践。SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程语言。以下是对这个主题的详细探讨: SQL基础: 1. 数据类型:SQL...
在本项目中,我们将探索如何利用Linux操作系统,Java编程语言,Python3,NumPy库以及STL文件格式来实现3D打印技术。这是一个跨学科的综合应用,涉及到计算机科学、软件开发以及制造技术。 首先,Linux是开源的操作...
单元测试学习小记软件测试什么是单元测试单元在程序里可以简单的理解为一个模块,一个方法。单元测试也就是在完成每个模块后都进行的测试。从确保每个模块没有问题,从而提高整体的程序质量。做单元测试的好处对于...
在“android开发小记”这个主题中,我们可以深入探讨Android应用程序开发的相关知识,特别是通过查看提供的压缩文件中的代码示例。这些文件名如lesson_8_code.zip至lesson_20_codel.zip,以及不同的Mp3Player版本,...
百度paddle课程学习小记(上)百度paddle课程学习小记(上)Day-1:python基础练习Day-2:《青春有你2》选手信息爬取遇到的问题Day-3《青春有你2》选手数据分析遇到的问题未完待续 百度paddle课程学习小记(上) 第...
《Xstream使用小记》 Xstream是一款Java库,它提供了简单且强大的方式来序列化和反序列化Java对象到XML,以及从XML回转换为Java对象。在本文中,我们将深入探讨Xstream的核心概念、使用场景以及如何通过实例进行...
auto p = new Foo(); // p 是 Foo* 类型 ``` - **优点**:减少代码长度,特别是在处理复杂类型时(如STL容器中的迭代器)。 - **注意事项**:`auto`不能用于声明函数的返回值,但在模板函数中有特殊用法——尾随...
CAPWAP(Control and Provisioning of Wireless Access Points)协议是一种用于无线接入点(AP)与无线控制器(AC)之间通信的标准化协议。该协议的主要目标是解决大规模无线网络部署中的管理和配置难题,使得瘦AP...
随笔小记.doc
这篇文章《咬人草小记》便是对这种植物的描述,以及作者与它亲密接触后的体验与思考。 文章的开始,是一段友人的警告:“这草,你可不能碰!”正是这句话,将作者的注意力引向了这种奇特的生物。咬人草的外表并...