Java實戰之圖書管理系統(JavaFX版)(7)——圖書類別維護界面及功能實現

本節概要

在上一節中實現了圖書類別的添加,而在本節將實現圖書界面的維護,即查詢、修改和刪除圖書記錄。

 

創建實體類

由於要將數據庫查詢到的記錄顯示到表格中,但是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
        );
    }

運行,輸入圖書類別名稱進行查詢,結果如下:

img

 

修改功能

修改圖書類別記錄。

其事件處理代碼在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;
        }
​
    }

img

 

 

可搜索微信公衆號【Java實例程序】或者掃描下方二維碼關注公衆號獲取更多。

注意:在公衆號後臺回覆【20200227】獲取本節源碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章