本节概要
在上一节中实现了图书类别的添加,而在本节将实现图书界面的维护,即查询、修改和删除图书记录。
创建实体类
由于要将数据库查询到的记录显示到表格中,但是JavaFX中表格显示数据的类型不同,因此需要再创建实体类。
在beans包创建BookTypeBeanTableData.java类,其内容如下:
package BookManageSystem.beans;
import javafx.beans.property.SimpleStringProperty;
public class BookTypeBeanTableData {
private SimpleStringProperty bookTypeId;
private SimpleStringProperty bookTypeName;
private SimpleStringProperty bookTypeDesciption;
public BookTypeBeanTableData() {}
public BookTypeBeanTableData(String bookTypeId, String bookTypeName, String bookTypeDesciption) {
this.bookTypeId = new SimpleStringProperty( bookTypeId);
this.bookTypeName = new SimpleStringProperty(bookTypeName);
this.bookTypeDesciption = new SimpleStringProperty(bookTypeDesciption);
}
public String getBookTypeId() {
return bookTypeId.get();
}
public SimpleStringProperty bookTypeIdProperty() {
return bookTypeId;
}
public void setBookTypeId(String bookTypeId) {
this.bookTypeId.set(bookTypeId);
}
public String getBookTypeName() {
return bookTypeName.get();
}
public SimpleStringProperty bookTypeNameProperty() {
return bookTypeName;
}
public void setBookTypeName(String bookTypeName) {
this.bookTypeName.set(bookTypeName);
}
public String getBookTypeDesciption() {
return bookTypeDesciption.get();
}
public SimpleStringProperty bookTypeDesciptionProperty() {
return bookTypeDesciption;
}
public void setBookTypeDesciption(String bookTypeDesciption) {
this.bookTypeDesciption.set(bookTypeDesciption);
}
}
Dao层方法
由于需要对数据库表的记录进行查询,所以在BookTypeDao中添加如下方法:
/**
* 操作结果:根据参数sql获取数据库记录数据
*
* @param sql SQL语句
* @return List 返回包含记录Records对象的集合
*/
public List getRecordsDataBySql(String sql) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
List list = new ArrayList();
try {
//获得数据的连接
conn = JDBCUtils.getConnection();
//获得Statement对象
stmt = conn.createStatement();
//发送SQL语句
rs = stmt.executeQuery(sql);
while (rs.next()) {
BookTypeBean bookTypeBean=new BookTypeBean();
bookTypeBean.setBookTypeId(rs.getInt(1));
bookTypeBean.setBookTypeName(rs.getString(2));
bookTypeBean.setBookTypeDescription(rs.getString(3));
list.add(bookTypeBean);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, stmt, conn);
}
return list;
}
界面设计
接下来就是创建图书类别维护界面了,在view包下创建bookTypeManageFrame.fxml文件,使用Scene Builder进行设计,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="700.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="BookManageSystem.controller.BookTypeManageFrameController">
<children>
<VBox alignment="CENTER" prefHeight="700.0" prefWidth="800.0">
<children>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<Label text="图书类别维护功能">
<font>
<Font name="System Bold" size="40.0"/>
</font>
</Label>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="111.0" prefWidth="600.0" spacing="30.0">
<children>
<Label text="图书类别名称:"/>
<TextField fx:id="bookTypeNameTextField"/>
<Button fx:id="checkButton" mnemonicParsing="false" onAction="#do_checkButton_event" text="查询"/>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="296.0" prefWidth="600.0">
<children>
<TableView fx:id="bookTypeManageTableView" prefHeight="399.0" prefWidth="605.0"
tableMenuButtonVisible="true">
<columns>
<TableColumn fx:id="idTableColumn" prefWidth="197.0" text="编号"/>
<TableColumn fx:id="bookTypeNameColumn" minWidth="0.0" prefWidth="201.0" text="图书类别名称"/>
<TableColumn fx:id="bookTypeDescriptionTableColumn" prefWidth="201.0" text="图书类别描述"/>
</columns>
</TableView>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="263.0" prefWidth="600.0">
<children>
<VBox fx:id="formVBox" prefHeight="240.0" prefWidth="602.0">
<children>
<HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="10.0">
<children>
<Label text="编号:"/>
<TextField fx:id="idTextField" prefHeight="30.0" prefWidth="165.0"/>
<Label text="图书类别名称:"/>
<TextField fx:id="bookTypeNameTextField2" prefHeight="30.0" prefWidth="174.0"/>
</children>
<padding>
<Insets left="40.0"/>
</padding>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0" spacing="10.0">
<children>
<Label text="描述:"/>
<TextArea fx:id="descriptionTextArea" prefHeight="80.0" prefWidth="463.0"/>
</children>
<padding>
<Insets left="40.0"/>
</padding>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="100.0">
<children>
<Button fx:id="alterButton" mnemonicParsing="false"
onAction="#do_alterButton_event" text="修改"/>
<Button fx:id="deleteButton" mnemonicParsing="false"
onAction="#do_deleteButton_event" text="删除"/>
</children>
<padding>
<Insets left="40.0"/>
</padding>
</HBox>
</children>
</VBox>
</children>
</HBox>
</children>
</VBox>
</children>
</AnchorPane>
并且在controller包下创建BookTypeManageFrameController.java类,从Scene Builder中复制控制器代码到该类中,并实例化SimpleTools和BookTypeDao两个类:
package BookManageSystem.controller;
import BookManageSystem.beans.BookTypeBeanTableData;
import BookManageSystem.dao.BookTypeDao;
import BookManageSystem.tools.SimpleTools;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.*;
/**
* 图书类别维护控制器
*
* @author lck100
*/
public class BookTypeManageFrameController {
private SimpleTools simpleTools = new SimpleTools();
private BookTypeDao bookTypeDao = new BookTypeDao();
@FXML
private TextField idTextField;
@FXML
private Button alterButton;
@FXML
private TableColumn<BookTypeBeanTableData, String> idTableColumn;
@FXML
private Button deleteButton;
@FXML
private TableView<BookTypeBeanTableData> bookTypeManageTableView;
@FXML
private TextField bookTypeNameTextField;
@FXML
private TableColumn<BookTypeBeanTableData, String> bookTypeNameColumn;
@FXML
private TextField bookTypeNameTextField2;
@FXML
private TextArea descriptionTextArea;
@FXML
private TableColumn<BookTypeBeanTableData, String> bookTypeDescriptionTableColumn;
// 【查询】按钮的事件监听器
public void do_checkButton_event(ActionEvent event) {
}
// 【修改】按钮的事件监听器
public void do_alterButton_event(ActionEvent event) {
}
// 【删除】按钮的事件监听器
public void do_deleteButton_event(ActionEvent event) {
}
}
运行项目,界面如下:
初始化表格数据
在BookTypeManageFrameController.java中添加如下方法初始化表格数据,即将从数据库查询的记录显示在表格中。
/**
* 初始化界面数据
*/
public void initialize() {
// 批量为按钮添加图标
simpleTools.setLabeledImage(new Labeled[]{alterButton, deleteButton}, new String[]{"src/BookManageSystem/images/edit.png", "src/BookManageSystem/images/delete.png"});
// 设置显示id的文本框不可编辑
idTextField.setEditable(false);
// 查询所有的图书类别列的SQL语句
String sql = "select * from tb_booktype;";
// 将数据添加到表格控件中
simpleTools.setBookTypeTableViewData(bookTypeManageTableView
, simpleTools.getBookTypeTableViewData(sql)
, idTableColumn
, bookTypeNameColumn
, bookTypeDescriptionTableColumn
);
}
由于要填充数据到JavaFX的表格控件中,因此在SimpleTools.java类中写了两个方法来填充数据,代码如下:
/**
* 将数据显示在图书类别表格中
*
* @param tableView 表格视图控件
* @param data 要显示要表格上的数据
* @param idColumn ID表格列控件
* @param nameColumn 图书类别名称列控件
* @param descriptionColumn 图书类别描述列控件
*/
public void setBookTypeTableViewData(TableView tableView, ObservableList data, TableColumn<BookTypeBeanTableData, String> idColumn, TableColumn<BookTypeBeanTableData, String> nameColumn, TableColumn<BookTypeBeanTableData, String> descriptionColumn) {
// 设置id列的数据
idColumn.setCellValueFactory(cellData -> cellData.getValue().bookTypeIdProperty());
// 设置图书类别名称列的数据
nameColumn.setCellValueFactory(cellData -> cellData.getValue().bookTypeNameProperty());
// 设置图书类别描述列的数据
descriptionColumn.setCellValueFactory(cellData -> cellData.getValue().bookTypeDesciptionProperty());
// 将数据添加到表格控件中
tableView.setItems(data);
}
/**
* 通过SQL从数据库表中查询图书类别数据并进行封装
*
* @param sql SQL语句
* @return 返回ObservableList<BookTypeBeanTableData>类型的数据
*/
public ObservableList<BookTypeBeanTableData> getBookTypeTableViewData(String sql) {
// 实例化BookTypeDao
BookTypeDao bookTypeDao = new BookTypeDao();
// 查询图书类别表的所有数据
List list = bookTypeDao.getRecordsDataBySql(sql);
// 创建ObservableList<BookTypeBeanTableData>对象
ObservableList<BookTypeBeanTableData> data = FXCollections.observableArrayList();
// 循环遍历集合中的数据
for (int i = 0; i < list.size(); i++) {
BookTypeBean r = (BookTypeBean) list.get(i);
// 将数据封装到BookTypeBeanTableData中
BookTypeBeanTableData td = new BookTypeBeanTableData(String.valueOf(r.getBookTypeId()), r.getBookTypeName(), r.getBookTypeDescription());
// 将BookTypeBeanTableData对象添加到data中
data.add(td);
}
// 返回数据
return data;
}
接着就是让图书类别维护菜单项点击后,切换到该界面。
因此在MainApp.java中添加如下方法加载图书类别维护界面的FXML文件:
/**
* 图书类别维护界面
* @return 返回一个AnchorPane便于其他控件调用
*/
public AnchorPane initBookTypeManageFrame() {
try {
// 加载图书类别维护界面
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/bookTypeManageFrame.fxml"));
AnchorPane root = loader.load();
return root;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
并在MainFrameController.java中的图书类别维护菜单项事件中调用起来,因此do_bookTypeManageMenuItem_event方法的代码如下:
/**
* “图书类别维护”菜单项的事件处理
*
* @param event 事件
*/
public void do_bookTypeManageMenuItem_event(ActionEvent event) {
// 当点击“图书类别维护”菜单项后,加载图书类别维护面板
AnchorPane pane = new MainApp().initBookTypeManageFrame();
// 清空界面上原有的控件
mainFrameAnchorPane.getChildren().clear();
// 将图书类别维护面板添加到界面上
mainFrameAnchorPane.getChildren().add(pane);
}
到此,运行程序点击“图书类别维护”菜单项该界面就会出现了
选中表格行显示数据
接下来是实现当用户选中表格中某一行时,将该行的数据显示在下面的文本框中。
在BookTypeManageFrameController.java中添加如下方法用来将选中行的内容显示在下面的文本框中:
// 选中行后将选中行内容显示在下面的文本框中
public void showBookTypeDetails(BookTypeBeanTableData bookTypeBeanTableData) {
// 判断是否选中
if (bookTypeBeanTableData == null) {
return;
} else {
// 如果表格行被选中,则将数据显示在下面的文本框中
idTextField.setText(bookTypeBeanTableData.getBookTypeId());
bookTypeNameTextField2.setText(bookTypeBeanTableData.getBookTypeName());
descriptionTextArea.setText(bookTypeBeanTableData.getBookTypeDesciption());
}
}
接着在initialize方法中调用这个方法,添加如下代码:
// 为表格控件注册事件监听器
bookTypeManageTableView.getSelectionModel().selectedItemProperty().addListener(
(observable, oldValue, newValue) -> showBookTypeDetails(newValue));
运行如下:
查询功能
点击“查询”按钮,表格显示用户查询得来的数据。
其事件处理代码如下:
// 【查询】按钮的事件监听器
public void do_checkButton_event(ActionEvent event) {
// 获取用户输入的图书类别
String bookTypeName = bookTypeNameTextField.getText();
// 组装查询SQL
String checkSQL = "";
// 判断用户是否输入图书类别,如果没有输入即为空字符串,那么就查询所有数据,否则按条件将那些查询
if (simpleTools.isEmpty(bookTypeName)) {
checkSQL = "select * from tb_booktype";
} else {
checkSQL = "select * from tb_booktype where btName='" + bookTypeName + "';";
}
// 重新绘制表格数据
simpleTools.setBookTypeTableViewData(bookTypeManageTableView
, simpleTools.getBookTypeTableViewData(checkSQL)
, idTableColumn
, bookTypeNameColumn
, bookTypeDescriptionTableColumn
);
}
运行,输入图书类别名称进行查询,结果如下:
修改功能
修改图书类别记录。
其事件处理代码在BookTypeManageFrameController.java中如下:
// 【修改】按钮的事件监听器
public void do_alterButton_event(ActionEvent event) {
// 获取用户输入的内容
String id = idTextField.getText();
String name = bookTypeNameTextField2.getText();
String description = descriptionTextArea.getText();
// 组装更新SQL
String alterSQL = "update tb_booktype set btName='" + name + "',btDescription='" + description + "' where " +
"btId=" + id + ";";
// 执行更新操作并获取操作结果
boolean isOK = bookTypeDao.dataChange(alterSQL);
// 对操作结果进行判断
if (isOK) {
// 更新成功则界面并清空各文本框及弹出提示框
initialize();
simpleTools.clearTextField(idTextField, bookTypeNameTextField2, descriptionTextArea);
simpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "修改成功!");
} else {
// 更新失败弹出提示框
simpleTools.informationDialog(Alert.AlertType.ERROR, "提示", "错误", "修改失败!");
}
}
执行效果如下:
删除功能
删除选中的表格行记录。
其事件处理代码如下:
// 【删除】按钮的事件监听器
public void do_deleteButton_event(ActionEvent event) {
// 获取要删除的id
String id = idTextField.getText();
// 组装删除的SQL语句
String sql1 = "set FOREIGN_KEY_CHECKS=0;";
String deleteSQL = "delete from tb_booktype where btId=" + id + ";";
String sql2 = "set FOREIGN_KEY_CHECKS=1;";
// 弹出确认框获取用户是否确认删除
boolean is = simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "是否删除?");
// 对删除结果进行判断
if (is) {
// 执行删除操作
bookTypeDao.dataChange(sql1);
boolean isOK = bookTypeDao.dataChange(deleteSQL);
bookTypeDao.dataChange(sql2);
// 对删除结果进行判断
if (isOK) {
// 删除成功则初始化表格数据,刷新表格
initialize();
// 清空用户输入
idTextField.setText("");
bookTypeNameTextField2.setText("");
descriptionTextArea.setText("");
// 弹出删除成功的提示框
simpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "删除成功!");
} else {
// 弹出删除失败的提示框
simpleTools.informationDialog(Alert.AlertType.ERROR, "提示", "错误", "删除失败!");
}
} else {
return;
}
}
可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。
注意:在公众号后台回复【20200227】获取本节源码。