本節概要
在上一節中實現了圖書類別的添加,而在本節將實現圖書界面的維護,即查詢、修改和刪除圖書記錄。
創建實體類
由於要將數據庫查詢到的記錄顯示到表格中,但是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】獲取本節源碼。