导入jxl.jar
一.实验要求
设计图形用户界面,用顺序存取文件方式分别完成新增、删除、修改、查询、显示功能:
新增:让用户能输入学生的信息(学号、姓名、电话、邮箱信息),检查无误后将数据存入文本文件;
删除:删除正在显示的学生信息;
修改:修改正在显示的一条学生信息,修改后可保存至文本文件;
查询:让用户输入姓名,一条条显示查询到的学生信息(借助“下一条”、“上一条”按钮查看下一条和上一条数据)。
显示:显示文件中存储的所有学生信息(借助“下一条”、“上一条”按钮查看下一条和上一条数据。
二.设计界面
Button:对应事件
添加:Add
显示:Show
查询:Select
删除:Delete
修改:Alter
保存:SaveInfo
上一条:Last
下一条:Next
还有个button叫保存当前值,没显示,事件为 AlterSave
三.Controller代码
package application;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.Alert.AlertType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class ExcelController {
@FXML
private TextField idTextField;
@FXML
private TextField emailTextField;
@FXML
private TextArea infoTextArea;
@FXML
private TextField nameTextField;
@FXML
private Button saveButton;
@FXML
private TextField teleTextField;
//学生信息的基本组成
String id,name,telephone,email;
//用于上一条下一条判断溢出以及记录现在文本框里显示的哪一条
int AllShowCnt=0;
int PartSelectCnt=0;
//判断现在在查询阶段还是显示阶段
boolean AllShow=false;
boolean PartSelect=false;
// 用于修改学生信息
String OldInfo;
String NewInfo;
//保存所有学生信息,实时更新
ArrayList<String> infoShow=new ArrayList<String>();
//用于查询时保存查询到的学生信息
ArrayList<String> infoSelect=new ArrayList<String>();
//使用的文件
File file;
//打开文件,没有就新创建,从文件里读取以前的数据
@FXML
void initialize() throws BiffException, IOException, RowsExceededException, WriteException
{
file=new File("Information.xls");
if(!file.exists())
file.createNewFile();
LoadInfo();
}
//展示下一条
@FXML
void Next(ActionEvent event) {
//如果是显示所有
if(AllShow)
{
AllShowCnt++;
if(AllShowCnt>=infoShow.size())
{
AllShowCnt--;
Warning("已经到最后一个学生了!");
return;
}
infoTextArea.setText(infoShow.get(AllShowCnt));
}
//如果是查询
else if(PartSelect)
{
PartSelectCnt++;
if(PartSelectCnt>=infoSelect.size())
{
PartSelectCnt--;
Warning("已经到最后一个学生了!");
return;
}
infoTextArea.setText(infoSelect.get(PartSelectCnt));
}
//既不是查询又不是显示
else
Warning("请先点击显示或者查询按钮!");
}
//展示上一条
@FXML
void Last(ActionEvent event) {
if(AllShow)
{
AllShowCnt--;
if(AllShowCnt<0)
{
AllShowCnt++;
Warning("已经到第一个学生了!");
return;
}
infoTextArea.setText(infoShow.get(AllShowCnt));
}
else if(PartSelect)
{
PartSelectCnt--;
if(PartSelectCnt<0)
{
PartSelectCnt++;
Warning("已经到第一个学生了!");
return;
}
infoTextArea.setText(infoSelect.get(PartSelectCnt));
}
else
Warning("请先点击显示或者查询按钮!");
}
//增加一个信息
@FXML
void Add(ActionEvent event) throws IOException, RowsExceededException, WriteException {
//判断增加信息是否成功
if(!getInformation())
return;
String info=id+" "+name+" "+telephone+" "+email;
infoShow.add(info);
idTextField.setText("");
nameTextField.setText("");
teleTextField.setText("");
emailTextField.setText("");
}
//查询相同名字的学生信息
@FXML
void Select(ActionEvent event) {
String targetName = nameTextField.getText();
if(targetName.equals(""))
{
Warning("查询的名字不能为空!");
return;
}
//清空
infoSelect.clear();
for (String studentInfo : infoShow)
{
String []sInfo=studentInfo.split(" ");
if(targetName.equals(sInfo[1]))
infoSelect.add(studentInfo);
}
infoTextArea.setText(infoSelect.get(0));
PartSelect=true;
AllShow=false;
}
//修改,记录以前的信息
@FXML
void Alter(ActionEvent event) {
OldInfo=infoTextArea.getText();
if(OldInfo.equals(""))
{
Warning("没有正在显示的学生信息!");
return;
}
saveButton.setVisible(true);
}
//展示第一条,并且触发AllShow
@FXML
void Show(ActionEvent event) throws BiffException, IOException {
infoTextArea.setText(infoShow.get(0));
AllShowCnt=0;
AllShow=true;
PartSelect=false;
}
//删除
@FXML
void Delete(ActionEvent event) {
String info=infoTextArea.getText();
if(info.equals(""))
{
Warning("没有正在显示的学生信息!");
return;
}
infoShow.remove(info);
}
//记录修改后的值
@FXML
void AlterSave(ActionEvent event) {
saveButton.setVisible(false);
NewInfo=infoTextArea.getText();
infoShow.set(AllShowCnt, NewInfo);
}
//获取学生信息
private boolean getInformation()
{
id = idTextField.getText();
name = nameTextField.getText();
telephone = teleTextField.getText();
email = emailTextField.getText();
if(id.equals("")||name.equals("")||telephone.equals("")||email.equals(""))
{
Warning("学生信息不能为空!");
return false;
}
return true;
}
//将新增的学生写入文件
public void SaveInfo() throws RowsExceededException, WriteException, IOException
{
WritableWorkbook workbook=Workbook.createWorkbook(file);
WritableSheet sheet=workbook.createSheet("sheet1", 0);
//把表头写好
String head[]={"学号","姓名","电话","邮箱"};
// 首行标题内容
for (int i = 0; i < head.length; i++)
{
// label表示一个单元格,第一个参数是列,第二个参数是行,第三个参数是内容
Label label = new Label(i, 0, head[i]);
sheet.addCell(label);
}
// 数据
for (int i = 0; i < infoShow.size(); i++)
{
String info[]=infoShow.get(i).split(" ");
for (int j = 0; j < 4; j++)
{
Label label = new Label(j, i+1, info[j]);
sheet.addCell(label);
}
}
workbook.write();
workbook.close();
}
//从文件中读取全部信息,存在infoShow里面
private void LoadInfo() throws BiffException, IOException
{
Workbook workbook=Workbook.getWorkbook(file);
Sheet sheet=workbook.getSheet(0);
for(int i=1;i<sheet.getRows();i++)
{
id=sheet.getCell(0,i).getContents();
name=sheet.getCell(1,i).getContents();
telephone=sheet.getCell(2,i).getContents();
email=sheet.getCell(3,i).getContents();
String info=id+" "+name+" "+telephone+" "+email;
infoShow.add(info);
}
for (String string : infoShow)
{
System.out.println(string);
}
workbook.close();
}
//用于弹出警示
private void Warning(String warningInfo)
{
Alert alert = new Alert(AlertType.WARNING);
alert.setTitle("Warning Dialog");
alert.setContentText(warningInfo);
alert.showAndWait();
}
}