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】获取本节源码。

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值