使用JDBC+javafx写一个简单功能齐全的图书管理系统_javafx图书管理系统(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

}

public String getTypeName() {
    return typeName;
}

public void setTypeName(String typeName) {
    this.typeName = typeName;
}

@Override
public String toString() {
    return typeName;
}

}



> 
> #### Ⅳ、controller包
> 
> 
> AddController
> 
> 
> 



package com.hk.sky.bookmanager.controller;

import com.hk.sky.bookmanager.bean.Book;
import com.hk.sky.bookmanager.bean.Category;
import com.hk.sky.bookmanager.dao.BookDao;
import com.hk.sky.bookmanager.dao.CategoryDao;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.stage.Stage;

import java.net.URL;
import java.sql.SQLException;
import java.util.*;

public class AddController implements Initializable {
@FXML
public Button add;
@FXML
public Button edit;

@FXML
private ComboBox<Category> categoryComboBox;

private ObservableList<Category> observableList = FXCollections.observableArrayList();

private CategoryDao categoryDao = new CategoryDao();

private BookDao bookDao = new BookDao();

@FXML
private TextField bookName;
@FXML
private TextField bookAuthor;
@FXML
private TextField bookPublisher;
@FXML
private TextField bookPrice;
@FXML
private TextField detail;
@FXML
private TextField bookStock;
public Book book;

public void setBook(Book book) {
    this.book = book;
}
//B用来判断是添加书籍还是编辑书籍
public boolean B;
public void setB(boolean i){
    this.B=i;
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    Platform.runLater(() -> {
        // 页面第一次加载的时候,就显示下拉列表
        observableList.clear();
        List<Category> categories = categoryDao.getAllCategories();
        observableList.addAll(categories);
        categoryComboBox.setItems(observableList);
        //添加书籍  修改书籍
        if (B){
            add.setVisible(true);
            add.setText("添加");
            edit.setVisible(false);
            edit.setText("");
            categoryComboBox.setValue(categories.get(0));
        }else {
            bookName.setText(book.getBookName());
            bookAuthor.setText(book.getAuthor());
            bookPublisher.setText(book.getPublisher());
            bookPrice.setText(String.valueOf(book.getPrice()));
            detail.setText(book.getDetail());
            bookStock.setText(String.valueOf(book.getStock()));
            categoryComboBox.setValue(categories.get(book.getTypeId()));
            edit.setVisible(true);
            edit.setText("修改");
            add.setDisable(false);
            add.setText("");
        }
    });
}
//给添加按钮设置点击事件
public void addBook() throws SQLException {
    // 用户点击添加按钮时,获取所有的数据,并插入到数据库当中
    String name = bookName.getText();
    String author = bookAuthor.getText();
    String publisher = bookPublisher.getText();
    String detail1 = detail.getText();

    // 将格式进行转换
    // 表单验证,判断用户是否输入内容
    if (name.equals("") || author.equals("") || publisher.equals("") || detail1.equals("") ||
            bookPrice.getText().equals("") || bookStock.getText().equals("")) {

        Alert error = new Alert(Alert.AlertType.ERROR, "输入错误");
        Button err = new Button();
        error.setTitle("您的书籍信息输入错误!");
        error.setHeaderText("请正确填写所要添加书籍的信息!");
        err.setOnAction((ActionEvent e) -> {
            error.showAndWait();
        });
        Optional<ButtonType> result = error.showAndWait();
    } else if (!bookPrice.getText().matches("[1-9]+[0-9]*")||!bookStock.getText().matches("[1-9]+[0-9]*")){
        Alert error = new Alert(Alert.AlertType.ERROR, "输入错误");
        Button err = new Button();
        error.setTitle("您的书籍信息输入错误!");
        error.setHeaderText("库存和价格必须为整数!");
        err.setOnAction((ActionEvent e) -> {
            error.showAndWait();
        });
        Optional<ButtonType> result = error.showAndWait();
    }else{
        // 思路:将上面获取到的数据封装成book,然后插入到数据库当中
        // 但是仔细思考,我们会碰到一个难点:如何获取ComboBox的选项?也就是说如何知道用户选的是哪一个类型的书籍?
        Category selectedCategory = categoryComboBox.getValue();
        int price = Integer.parseInt(bookPrice.getText());
        int stock = Integer.parseInt(bookStock.getText());

        // 将所有的数据封装成书籍
        Book book = new Book(name, author, publisher, price, detail1, stock, selectedCategory.getId());
        // 调用BookDao中的方法将数据插入到数据库当中
        Alert information = new Alert(Alert.AlertType.INFORMATION, "恭喜您书籍添加成功");
        Button err = new Button();
        information.setTitle("添加成功!");
        information.setHeaderText("林氏图书馆又收录了一本新书,感谢!");
        err.setOnAction((ActionEvent e) -> {
            information.showAndWait();
        });
        Optional<ButtonType> result = information.showAndWait();

        // 插入成功之后,首先当前属性应该关闭
        if (bookDao.insertBook(book)){
            ((Stage) bookName.getScene().getWindow()).close();
        }
    }
}
//给编辑按钮设置点击事件
public void editBook(ActionEvent actionEvent) throws SQLException{
    // 用户点击添加按钮时 ,获取所有的数据,并插入到数据库当中
    String name = bookName.getText();
    String author = bookAuthor.getText();
    String publisher = bookPublisher.getText();
    String detail1 = detail.getText();

    // 将格式进行转换
    // 表单验证,判断用户是否输入内容
    if (name.equals("")||author.equals("")||publisher.equals("")||detail1.equals("")||
            bookPrice.getText().equals("")||bookStock.getText().equals("")){

        Alert error=new Alert(Alert.AlertType.ERROR,"输入错误");
        Button err=new Button();
        error.setTitle("您的书籍信息输入错误!");
        error.setHeaderText("请正确填写所要修改书籍的信息!");
        err.setOnAction((ActionEvent e)->{
            error.showAndWait();
        });
        Optional<ButtonType> result = error.showAndWait();
    }else if (!bookPrice.getText().matches("[1-9]+[0-9]*")||!bookStock.getText().matches("[1-9]+[0-9]*")){
        Alert error = new Alert(Alert.AlertType.ERROR, "输入错误");
        Button err = new Button();
        error.setTitle("您的书籍信息输入错误!");
        error.setHeaderText("库存和价格必须为整数!");
        err.setOnAction((ActionEvent e) -> {
            error.showAndWait();
        });
        Optional<ButtonType> result = error.showAndWait();
    }else {
        int price = Integer.parseInt(bookPrice.getText());
        int stock = Integer.parseInt(bookStock.getText());

        // 思路:将上面获取到的数据封装成book,然后插入到数据库当中
        // 但是仔细思考,我们会碰到一个难点:如何获取ComboBox的选项?也就是说如何知道用户选的是哪一个类型的书籍?
        Category selectedCategory = categoryComboBox.getValue();

        // 将所有的数据封装成书籍
        Book book1 = new Book(name, author, publisher, price, detail1, stock, selectedCategory.getId());
        book1.setId(book.getId());
        // 调用BookDao中的方法将数据插入到数据库当中
        Alert information=new Alert(Alert.AlertType.INFORMATION,"恭喜您书籍信息修改成功");
        Button err=new Button();
        information.setTitle("修改成功!");
        information.setHeaderText("谢谢您为林氏图书馆添砖加瓦,感谢!");
        err.setOnAction((ActionEvent e)->{
            information.showAndWait();
        });
        Optional<ButtonType> result = information.showAndWait();
        boolean success = bookDao.updateBook(book1);
        // 插入成功之后,首先当前属性应该关闭
        if (success) {
            ((Stage)bookName.getScene().getWindow()).close();
        }
    }
}

}



> 
>  EnrollController
> 
> 
> 



package com.hk.sky.bookmanager.controller;

import com.hk.sky.bookmanager.bean.Admin;
import com.hk.sky.bookmanager.dao.AdminDao;
import com.hk.sky.bookmanager.utils.DBUtils;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Objects;
import java.util.Optional;

public class EnrollController {
@FXML
public TextField username1;
@FXML
public PasswordField password1;
@FXML
public Text errorMsg;//提示错误信息
@FXML
private Button alert;
@FXML
private Button enroll;
@FXML
public Text title;
AdminDao adminDao=new AdminDao();

//给注册按钮设置点击事件
public void enrollBtn() {
    String account=username1.getText();
    String pw=password1.getText();

    if (Objects.equals(account, "")){
        errorMsg.setText("请填写用户名");
    }else if (Objects.equals(pw, "")){
        errorMsg.setText("请填写密码");
    }else {
        boolean b=adminDao.enroll(account,pw);
        if(!b){
            errorMsg.setText("用户名已使用,请更改用户名!");
        }else {
            Alert information=new Alert(Alert.AlertType.INFORMATION,"恭喜"+account+"用户注册成功");
            Button err=new Button();
            information.setTitle("注册成功!");
            information.setHeaderText("林氏图书馆欢迎您的到来!");
            err.setOnAction((ActionEvent e)->{
                information.showAndWait();
            });
            Optional<ButtonType> result = information.showAndWait();
            // 关闭当前Stage,问题:如何获取当前的stage?
            Stage currentWindow = (Stage)username1.getScene().getWindow();
            currentWindow.close();
        }

    }
}

//区分是注册还是修改密码,修改密码的话账号无法更改,输入框为不可选择,注册按钮消失,修改按钮显示
public void qf(boolean b){
    if (b){
        enroll.setVisible(false);
        alert.setVisible(true);

        username1.setDisable(true);
    }
}
//s用来保存原密码,修改密码无法更改为原密码
public String s;
public void setS(String ss){
    s=ss;
}
//给修改密码设置点击事件
public void alertBtn() throws SQLException {
    if (password1.getText().equals("")){
        errorMsg.setText("密码不能为空");
    }else if(password1.getText().equals(s)){
        errorMsg.setText("不能与最近使用密码相同");
    }else {
        Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "你是否真的要修改该密码?");
        alert.setTitle("修改密码");
        alert.setHeaderText("确认修改?");
        Optional<ButtonType> result = alert.showAndWait();
        if (result.isPresent()){
            adminDao.alertPassword(username1.getText(),password1.getText());
            Alert information = new Alert(Alert.AlertType.INFORMATION, "恭喜您修改密码成功!");
            Button err = new Button();
            information.setTitle("修改密码");
            information.setHeaderText("修改密码成功!");
            err.setOnAction((ActionEvent e) -> {
                information.showAndWait();
            });
            Optional<ButtonType> rs = information.showAndWait();
        }
    }
}

}



> 
>  HouTaiController
> 
> 
> 



package com.hk.sky.bookmanager.controller;

import com.hk.sky.bookmanager.BookManagerApplication;
import com.hk.sky.bookmanager.bean.Admin;
import com.hk.sky.bookmanager.bean.Book;
import com.hk.sky.bookmanager.dao.AdminDao;
import com.hk.sky.bookmanager.dao.BookDao;
import javafx.application.Platform;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.ResourceBundle;

public class HouTaiController implements Initializable {
/搜索框/
public TextField search;
/下拉框/
public ComboBox categorySelect;

// 不能直接从这里查询用户信息,因为在当前这个类当中,我不知道是谁登录了
// 通过上一个类传递到当前类当中,我们需要在当前类中定义要传递的数据,然后通过set方法设置该属性的值
private Admin admin;
public String bookName;
public String bookAuthor;
public String Publish;
//表示查询到的行
public int sumPage;
//n表示页数
public int n;
public void setAdmin(Admin admin) {
    this.admin = admin;
}
public void setSumPage(int i){
    this.sumPage=i;
    double j=i/9.0;
    n=(int) Math.ceil(j);
}
public void setBookName(String s){
    bookName=s;
}
@FXML
private Text welcomeMsg;
@FXML
private Text searchCount;
@FXML
private Text searchPage;
@FXML//返回按钮
private Button fh;
//给表添加数据
@FXML
private TableView<Book> bookTable;
// 准备表格中的数据
private ObservableList<Book> data = FXCollections.observableArrayList();
// 准备dao类,它负责到数据库中查询
private BookDao bookDao = new BookDao();
private AdminDao adminDao=new AdminDao();
//添加按钮操作
// 编辑按钮
private TableColumn<Book, Integer> editColumn = new TableColumn<>("编辑");

// 删除按钮
private TableColumn<Book, Integer> delColumn = new TableColumn<>("删除");

// 详情按钮
private TableColumn<Book, Integer> detailColumn = new TableColumn<>("详情");


// 上一个页面中将admin传递过来,我们需要在当前窗口中来获取传递过来的数据,然后将值设置给页面中的元素显示
// 将当前类实现Initializable接口,然后在initialize(初始化)方法中获取设置的值,然后设置给页面中的元素
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    // 通过UI线程获取值,并设置值
    Platform.runLater(() -> {
        welcomeMsg.setText("欢迎" + admin.getAccount() + "管理员登录!");
        searchCount.setText("共"+sumPage+"条记录");
        categorySelect.getItems().addAll(
                "书名",
                "出版社",
                "作者"
        );
        categorySelect.setValue("书名");
        // 查询数据库,设置ObservableList,并添加至tableView当中
        List<Book> books = bookDao.set(search.getText(),0);
        data.addAll(books);
        bookTable.setItems(data);

        //1、添加编辑按钮
        editColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().getId()));
        editColumn.setCellFactory(param -> new TableCell<>(){
            final Button editBtn = new Button("编辑");
            @Override
            protected void updateItem(Integer item, boolean empty) {
                super.updateItem(item, empty);
                if (item == null) {
                    setGraphic(null);
                    return;
                }
                setGraphic(editBtn);
                // 添加点击事件
                editBtn.setOnMouseClicked(event ->{
                    try {
                        Stage newStage = new Stage();
                        FXMLLoader fxmlLoader = new FXMLLoader(BookManagerApplication.class.getResource("book/add.fxml"));
                        Scene scene = new Scene(fxmlLoader.load(), 280, 400);
                        newStage.setTitle("编辑书籍");
                        newStage.setScene(scene);
                        AddController addController=fxmlLoader.getController();
                        addController.setB(false);
                        addController.setBook(bookDao.getbookById(item));
                        newStage.show();
                        // 我们需要监听添加页面关闭后,刷新tableview
                        // CloseRequest()只有在用户点击右上角的叉时才会触发
                        newStage.setOnHiding(evt->{
                            refreshTableView(i);
                        });
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }

                });
            }
        });
        //将列添加至表中
        bookTable.getColumns().add(editColumn);

        //2、添加删除按钮
        delColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().getId()));
        delColumn.setCellFactory(param -> new TableCell<>(){
            // 创建删除按钮
            final Button editBtn = new Button("删除");

            @Override
            protected void updateItem(Integer item, boolean empty) {
                super.updateItem(item, empty);
                if (item == null) {
                    setGraphic(null);
                    return;
                }
                setGraphic(editBtn);

                // 添加点击事件
                editBtn.setOnMouseClicked(event -> {
                    // 添加一个对话框,判断用户是否需要真的删除
                    Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "你是否需要真的删除这本吗?");
                    alert.setTitle("警告");
                    alert.setHeaderText("确认删除?");
                    Optional<ButtonType> result = alert.showAndWait();

                    if (result.isPresent() && result.get() == ButtonType.OK) {
                        // 实现删除功能
                        bookDao.deleteBookById(item);
                        // 刷新页面
                        refreshTableView(i);
                    }
                });

            }
        });
        //将列添加至表中
        bookTable.getColumns().add(delColumn);

        // 3、添加详情按钮
        detailColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().getId()));
        detailColumn.setCellFactory(param -> new TableCell<>(){
            // 创建详情按钮
            final Button editBtn = new Button("详情");
            @Override
            protected void updateItem (Integer item,boolean empty){
                super.updateItem(item, empty);
                if (item == null) {
                    setGraphic(null);
                    return;
                }
                setGraphic(editBtn);

                // 添加点击事件
                editBtn.setOnMouseClicked(event -> {
                    try {
                        Stage newStage = new Stage();
                        FXMLLoader fxmlLoader = new FXMLLoader(BookManagerApplication.class.getResource("book/show.fxml"));
                        Scene scene = new Scene(fxmlLoader.load(), 280, 270);
                        newStage.setTitle("书籍详情");
                        newStage.setScene(scene);

                        // 将当前书籍id传递到下一个页面当中
                        ShowController showController = fxmlLoader.getController();
                        showController.setBook(bookDao.getbookById(item));

                        // 显示要打开的Stage,stage.show()
                        newStage.show();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                });
                //将列添加至表中
            }
        });
        bookTable.getColumns().add(detailColumn);
    });
}

public void refreshTableView(int i){
    // 在往集合中添加数据之前,先清空集合
    data.clear();

    List<Book> books = null;
    // 查询数据库,设置ObservableList,并添加至tableView当中
    if(categorySelect.getValue().equals("作者")&&bookAuthor!=null) {
        setSumPage(bookDao.likeSumCountByAuthor(search.getText()));
        if (i==n)
            i--;
        books= bookDao.setByAuthor(bookAuthor, i);
        searchCount.setText("共"+bookDao.likeSumCountByAuthor(search.getText())+"条记录");
    }else if (categorySelect.getValue().equals("出版社")&&Publish!=null){
        setSumPage(bookDao.likeSumCountByPublish(search.getText()));
        if (i==n)
            i--;
        books= bookDao.setByPublish(Publish, i);
        searchCount.setText("共"+bookDao.likeSumCountByPublish(search.getText())+"条记录");
    }else {
        setSumPage(bookDao.likeSumCount(search.getText()));
        if (i==n)
            i--;
        books= bookDao.set(bookName, i);
        searchCount.setText("共"+bookDao.likeSumCount(search.getText())+"条记录");

    }

    data.addAll(books);
    bookTable.setItems(data);

    int z=i+1;
    searchPage.setText("第"+z+"页");
}

int i=0;
//首页按钮
public void start(){
    if (i!=0){
        data.clear();
        List<Book> books=null;
        // 查询数据库,设置ObservableList,并添加至tableView当中
        if (categorySelect.getValue().equals("出版社")&&Publish!=null){
            books=bookDao.setByPublish(Publish,0);
        }else if (categorySelect.getValue().equals("作者")&&bookAuthor!=null){
            books=bookDao.setByAuthor(bookAuthor,0);
        }else {
            books= bookDao.set(bookName,0);
        }

        data.addAll(books);
        bookTable.setItems(data);
        i=0;
        searchPage.setText("第"+1+"页");
    }
}
//尾页按钮
public void end(){
    if (i!=n-1){
        data.clear();
        List<Book> books=null;
        // 查询数据库,设置ObservableList,并添加至tableView当中
        // 查询数据库,设置ObservableList,并添加至tableView当中
        if (categorySelect.getValue().equals("出版社")&&Publish!=null){
            books=bookDao.setByPublish(Publish,n-1);
        }else if (categorySelect.getValue().equals("作者")&&bookAuthor!=null){
            books=bookDao.setByAuthor(bookAuthor,n-1);
        }else {
            books= bookDao.set(bookName,n-1);
        }

        data.addAll(books);
        bookTable.setItems(data);
        i=n-1;
        searchPage.setText("第"+n+"页");
    }
}
//上一页按钮
public void up(){
    if (i>0&&i<=n-1){
        data.clear();
        // 查询数据库,设置ObservableList,并添加至tableView当中
        List<Book> books=null;
        // 查询数据库,设置ObservableList,并添加至tableView当中
        if (categorySelect.getValue().equals("出版社")&&Publish!=null){
            books=bookDao.setByPublish(Publish,--i);
        }else if (categorySelect.getValue().equals("作者")&&bookAuthor!=null){
            books=bookDao.setByAuthor(bookAuthor,--i);
        }else {
            books= bookDao.set(bookName,--i);
        }
        data.addAll(books);
        bookTable.setItems(data);
        int z=i+1;
        searchPage.setText("第"+z+"页");
    }
}
//下一页按钮
public void next(){
    if (i<n-1&&i>=0){
        data.clear();
        // 查询数据库,设置ObservableList,并添加至tableView当中
        List<Book> books=null;
        // 查询数据库,设置ObservableList,并添加至tableView当中
        if (categorySelect.getValue().equals("出版社")&&Publish!=null){
            books=bookDao.setByPublish(Publish,++i);
        }else if (categorySelect.getValue().equals("作者")&&bookAuthor!=null){
            books=bookDao.setByAuthor(bookAuthor,++i);
        }else {
            books= bookDao.set(bookName,++i);
        }
        data.addAll(books);
        bookTable.setItems(data);
        int z=i+1;
        searchPage.setText("第"+z+"页");
    }
}
//搜索按钮
public void searchBtn() throws IOException {
   if (categorySelect.getValue().equals("书名")){
    if (!Objects.equals(search.getText(), "")){
        if (bookDao.likeSumCount(search.getText())==0){
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "抱歉,为查找到有关该图书!");
            alert.setTitle("查找错误");
            alert.setHeaderText("请重新填写所要查找书籍的名称!");
            Optional<ButtonType> result = alert.showAndWait();
        }else {
            fh.setVisible(true);
            bookName=search.getText();
            // 在往集合中添加数据之前,先清空集合
            data.clear();
            // 查询数据库,设置ObservableList,并添加至tableView当中
            List<Book> books = bookDao.set(bookName,0);
            data.addAll(books);
            bookTable.setItems(data);
            setSumPage(bookDao.likeSumCount(bookName));
            searchCount.setText("共"+bookDao.likeSumCount(search.getText())+"条记录");
            i=0;
            searchPage.setText("第"+1+"页");
        }
    }else {
        Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "错误,搜索框中未输入查询数据!");
        alert.setTitle("输入错误");
        alert.setHeaderText("请填写所要查找书籍的名称,书籍名不能为空!");
        Optional<ButtonType> result = alert.showAndWait();
    }
   }else if (categorySelect.getValue().equals("作者")){
       if (!Objects.equals(search.getText(), "")){
           if (bookDao.likeSumCountByAuthor(search.getText())==0){
               Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "抱歉,未查找到有关该图书!");
               alert.setTitle("查找错误");
               alert.setHeaderText("请重新填写所要查找书籍的作者!");
               Optional<ButtonType> result = alert.showAndWait();
           }else {
               fh.setVisible(true);
               bookAuthor=search.getText();
               // 在往集合中添加数据之前,先清空集合
               data.clear();
               // 查询数据库,设置ObservableList,并添加至tableView当中
               List<Book> books = bookDao.setByAuthor(bookAuthor,0);
               data.addAll(books);
               bookTable.setItems(data);
               setSumPage(bookDao.likeSumCountByAuthor(bookAuthor));
               searchCount.setText("共"+bookDao.likeSumCountByAuthor(bookAuthor)+"条记录");
               i=0;
               searchPage.setText("第"+1+"页");
           }
       }else {
           Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "错误,搜索框中未输入查询数据!");
           alert.setTitle("输入错误");
           alert.setHeaderText("请填写所要查找书籍的作者,作者名不能为空!");
           Optional<ButtonType> result = alert.showAndWait();
       }
   }else {
       if (!Objects.equals(search.getText(), "")){
           if (bookDao.likeSumCountByPublish(search.getText())==0){
               Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "抱歉,未查找到有关该图书!");
               alert.setTitle("查找错误");
               alert.setHeaderText("请重新填写所要查找书籍的出版社!");
               Optional<ButtonType> result = alert.showAndWait();
           }else {
               fh.setVisible(true);
               Publish=search.getText();
               // 在往集合中添加数据之前,先清空集合
               data.clear();
               // 查询数据库,设置ObservableList,并添加至tableView当中
               List<Book> books = bookDao.setByPublish(Publish,0);
               data.addAll(books);
               bookTable.setItems(data);
               setSumPage(bookDao.likeSumCountByPublish(Publish));
               searchCount.setText("共"+bookDao.likeSumCountByPublish(Publish)+"条记录");
               i=0;
               searchPage.setText("第"+1+"页");
           }
       }else {
           Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "错误,搜索框中未输入查询数据!");
           alert.setTitle("输入错误");
           alert.setHeaderText("请填写所要查找书籍的出版社,出版社名不能为空!");
           Optional<ButtonType> result = alert.showAndWait();
       }
   }
}
//删除按钮
public void deleteBtn() {
    Book book1=null;
    String bookName=search.getText();
    book1=bookDao.getBookByBookName(bookName);
    if (book1!=null){
        // 添加一个对话框,判断用户是否需要真的删除
        Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "你是否需要真的删除这本书吗?");
        alert.setTitle("警告");
        alert.setHeaderText("确认删除?");
        Optional<ButtonType> result = alert.showAndWait();

        if (result.isPresent() && result.get() == ButtonType.OK) {
            // 实现删除功能
            bookDao.deleteBookByBookName(bookName);
            // 刷新页面
            refreshTableView(i);
        }
    }else {
        // 添加一个对话框,告诉用户没有这本书
        Alert error=new Alert(Alert.AlertType.ERROR,"删除错误,该图书馆未收录此书!");
        Button err=new Button();
        error.setTitle("删除错误!");
        error.setHeaderText("请重新填写要删除的书籍!");
        err.setOnAction((ActionEvent e)->{
            error.showAndWait();
        });
        Optional<ButtonType> result = error.showAndWait();
    }
}
//添加按钮
public void addBtn()  {
    try {
        Stage newStage = new Stage();
        FXMLLoader fxmlLoader = new FXMLLoader(BookManagerApplication.class.getResource("book/add.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 280, 400);
        newStage.setTitle("添加书籍");
        newStage.setScene(scene);
        AddController addController=fxmlLoader.getController();
        addController.setB(true);

        newStage.show();
        // 我们需要监听添加页面关闭后,刷新tableview
        // CloseRequest()只有在用户点击右上角的叉时才会触发
        newStage.setOnHiding(event -> {
            refreshTableView(i);
        });
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

}
//返回按钮
public void back(ActionEvent actionEvent) {
    categorySelect.setValue("书名");
    search.setText("");
    bookName=search.getText();
    // 在往集合中添加数据之前,先清空集合
    data.clear();
    // 查询数据库,设置ObservableList,并添加至tableView当中
    List<Book> books = bookDao.set(bookName,0);
    data.addAll(books);
    bookTable.setItems(data);
    setSumPage(bookDao.likeSumCount(bookName));
    searchCount.setText("共"+bookDao.likeSumCount(search.getText())+"条记录");
    i=0;
    searchPage.setText("第"+1+"页");
    fh.setVisible(false);
}
//注销按钮
public void zx(ActionEvent actionEvent) throws IOException {
    Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "你是否真的要注销该账号?");
    alert.setTitle("警告");
    alert.setHeaderText("确认注销?");
    Optional<ButtonType> result = alert.showAndWait();
    if (result.isPresent() && result.get() == ButtonType.OK) {
        adminDao.delete(admin.getAccount());
        //提醒用户该账号已注销,请重新登录
        Alert information = new Alert(Alert.AlertType.INFORMATION, "该账号已注销!");
        Button err = new Button();
        information.setTitle("登录失败!");
        information.setHeaderText("该账号已注销,请重新登录");
        err.setOnAction((ActionEvent e) -> {
            information.showAndWait();
        });
        Optional<ButtonType> result1 = information.showAndWait();

        //关闭 后台 页面
        Stage currentWindow = (Stage)search.getScene().getWindow();
        currentWindow.close();

        //重新显示登录页面
        Stage stage = new Stage();
        FXMLLoader fxmlLoader = new FXMLLoader(BookManagerApplication.class.getResource("login/login.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 290, 240);
        stage.setTitle("用户登录");
        stage.setScene(scene);

        stage.show();
    }
}
//修改密码
public void xgmm(ActionEvent actionEvent) throws IOException {
    Stage stage = new Stage();
    FXMLLoader fxmlLoader = new FXMLLoader(BookManagerApplication.class.getResource("login/enroll.fxml"));
    Scene scene = new Scene(fxmlLoader.load(), 290, 251);
    stage.setTitle("修改密码");
    stage.setScene(scene);
    EnrollController enrollController=fxmlLoader.getController();
    enrollController.username1.setText(admin.getAccount());
    enrollController.password1.setText(admin.getPassword());
    String s=admin.getPassword();
    enrollController.title.setText("修改密码");
    enrollController.setS(admin.getPassword());

    enrollController.qf(true);
    stage.show();
    //添加监听事件,检查密码是否更换
    stage.setOnHiding(evt -> {
        try {
            if (adminDao.checkPassword(admin.getAccount(),s)){
                Alert information = new Alert(Alert.AlertType.INFORMATION, "该账号已注销!");
                Button err = new Button();
                information.setTitle("登录失败!");
                information.setHeaderText("该账号已注销,请重新登录");
                err.setOnAction((ActionEvent e) -> {
                    information.showAndWait();
                });
                Optional<ButtonType> result1 = information.showAndWait();

                //关闭 后台 页面
                Stage currentWindow = (Stage)search.getScene().getWindow();
                currentWindow.close();

                //重新显示登录页面
                Stage stage1 = new Stage();
                FXMLLoader fxmlLoader1 = new FXMLLoader(BookManagerApplication.class.getResource("login/login.fxml"));
                Scene scene1 = new Scene(fxmlLoader1.load(), 290, 240);
                stage1.setTitle("用户登录");
                stage1.setScene(scene1);
                LoginController loginController=fxmlLoader1.getController();
                loginController.username.setText(admin.getAccount());
                stage1.show();
                adminDao.reset();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    });

}

}



> 
> LoginController
> 
> 
> 



package com.hk.sky.bookmanager.controller;

import com.hk.sky.bookmanager.BookManagerApplication;
import com.hk.sky.bookmanager.bean.Admin;
import com.hk.sky.bookmanager.dao.AdminDao;
import com.hk.sky.bookmanager.dao.BookDao;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.io.IOException;

public class LoginController {

@FXML
public TextField username;

@FXML
private PasswordField password;

@FXML
private Text errorMsg;
//设置上一次登录账号的账号密码
public void set(String un,String pw){
    if (un!=null&&pw!=null){
        username.setText(un);
        password.setText(pw);
    }
}

@FXML
//登录按钮 检查是否有该账号以及账号密码的正确性
public void checkLogin() throws IOException {
    // 获取输入框中的内容
    String uname = username.getText();
    String pwd = password.getText();

    // 判断用户名与密码
    AdminDao adminDao = new AdminDao();
    Admin admin = adminDao.checkLogin(uname, pwd);
    if (admin == null) {
        errorMsg.setText("用户名或者密码错误");
    } else {
        // 跳转到后面页面
        // 创建要打开的Stage,问题:stage如何创建?
        Stage newStage = new Stage();
        FXMLLoader fxmlLoader = new FXMLLoader(BookManagerApplication.class.getResource("book/houtai.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 700, 430);
        newStage.setTitle("后台页面");
        newStage.setScene(scene);

        // 关闭当前Stage,问题:如何获取当前的stage?
        Stage currentWindow = (Stage) username.getScene().getWindow();
        currentWindow.close();
        //消除上次用户登录的信息
        adminDao.reset();
        //保存这次用户登录的信息
        adminDao.setLast(username.getText());

        // 将当前用户的信息传递到下一个页面当中
        HouTaiController houTaiController = fxmlLoader.getController();
        BookDao bookdao=new BookDao();
        houTaiController.setSumPage(bookdao.sumPage());
        houTaiController.setAdmin(admin);
        houTaiController.setBookName("");

        // 显示要打开的Stage,stage.show()
        newStage.show();
    }
}
//注册按钮
public void enrollLogin() throws IOException{
    Stage stage = new Stage();
    FXMLLoader fxmlLoader = new FXMLLoader(BookManagerApplication.class.getResource("login/enroll.fxml"));
    Scene scene = new Scene(fxmlLoader.load(), 290, 251);
    stage.setTitle("用户注册");
    stage.setScene(scene);
    stage.show();
}

}



> 
>  ShowController
> 
> 
> 



package com.hk.sky.bookmanager.controller;

import com.hk.sky.bookmanager.bean.Book;
import com.hk.sky.bookmanager.dao.BookDao;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.text.Text;

import java.net.URL;
import java.util.ResourceBundle;

public class ShowController implements Initializable {
@FXML
public Text bookId;
Book book=null;
public void setBook(Book book1){
this.book=book1;
}
private BookDao bookDao = new BookDao();

@FXML
private Text bookName;
@FXML
private Text bookAuthor;
@FXML
private Text bookPublish;
@FXML
private Text bookPrice;
@FXML
private Text bookStock;
@FXML
private Text bookDetail;

//书籍详情页面显示
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    Platform.runLater(() -> {
        bookId.setText(String.valueOf(book.getId()));
        bookName.setText(book.getBookName());
        bookAuthor.setText(book.getAuthor());
        bookPublish.setText(book.getPublisher());
        bookPrice.setText(String.valueOf(book.getPrice()));
        bookStock.setText(String.valueOf(book.getStock()));
        bookDetail.setText(book.getDetail());
    });
}

}



> 
> module-info
> 
> 
> 



module com.example.bookmange {
requires javafx.controls;
requires javafx.fxml;
requires javafx.web;

requires org.controlsfx.controls;
requires validatorfx;
requires org.kordamp.ikonli.javafx;
requires org.kordamp.bootstrapfx.core;
requires eu.hansolo.tilesfx;
requires java.sql;

opens com.hk.sky.bookmanager to javafx.fxml;
exports com.hk.sky.bookmanager;
exports com.hk.sky.bookmanager.controller;
opens com.hk.sky.bookmanager.controller to javafx.fxml;
opens com.hk.sky.bookmanager.bean to javafx.base;

}



> 
> ###  2)resources(为资源文件包,可以看链接文章了解)
> 
> 
> #### Ⅰ、book包
> 
> 
> add.fxml
> 
> 
> 



<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.geometry.Insets?> <?import javafx.scene.text.Text?> <?import java.net.URL?>

<padding>
    <Insets left="20" top="30"/>
</padding>

<Text text="类型:" GridPane.rowIndex="0" GridPane.columnIndex="0"/>
<ComboBox  GridPane.halignment="CENTER" GridPane.rowIndex="0" GridPane.columnIndex="1" fx:id="categoryComboBox">
</ComboBox>

<Text text="书名:" GridPane.rowIndex="1" GridPane.columnIndex="0"/>
<TextField fx:id="bookName" GridPane.rowIndex="1" GridPane.columnIndex="1"/>

<Text text="作者:" GridPane.rowIndex="2" GridPane.columnIndex="0"/>
<TextField fx:id="bookAuthor" GridPane.rowIndex="2" GridPane.columnIndex="1"/>

<Text text="出版社:" GridPane.rowIndex="3" GridPane.columnIndex="0"/>
<TextField fx:id="bookPublisher" GridPane.rowIndex="3" GridPane.columnIndex="1"/>

<Text text="价格:" GridPane.rowIndex="4" GridPane.columnIndex="0"/>
<TextField fx:id="bookPrice" GridPane.rowIndex="4" GridPane.columnIndex="1"/>

<Text text="内容简介:" GridPane.rowIndex="5" GridPane.columnIndex="0"/>
<TextField fx:id="detail" GridPane.rowIndex="5" GridPane.columnIndex="1"/>

<Text text="库存:" GridPane.rowIndex="6" GridPane.columnIndex="0"/>
<TextField fx:id="bookStock" GridPane.rowIndex="6" GridPane.columnIndex="1"/>

<Button fx:id="add" text="添加" onAction="#addBook" GridPane.rowIndex="7" GridPane.columnIndex="0" GridPane.columnSpan="2"
        GridPane.halignment="CENTER" styleClass="aBtn" visible="true" > </Button>

<Button fx:id="edit" onAction="#editBook" GridPane.rowIndex="7" GridPane.columnIndex="0" GridPane.columnSpan="2"
        GridPane.halignment="CENTER" styleClass="eBtn" visible="false"> </Button>
<stylesheets>
    <URL value="@add.css"/>
</stylesheets>


> 
>  houtai.fxml
> 
> 
> 



<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.Text?> <?import javafx.geometry.Insets?> <?import javafx.scene.control.cell.PropertyValueFactory?> <?import java.net.URL?>

<Button fx:id="fh" text="返回" visible="false" onAction="#back"/>

<Text id="wm" fx:id="welcomeMsg" AnchorPane.leftAnchor="290" AnchorPane.topAnchor="10"/>

<Button  text="修改密码"  onAction="#xgmm" AnchorPane.leftAnchor="585"/>
<Button  text="注销"  onAction="#zx" AnchorPane.leftAnchor="658"/>

<HBox AnchorPane.leftAnchor="180" AnchorPane.topAnchor="35">
    <ComboBox    fx:id="categorySelect">
    </ComboBox>
    <TextField fx:id="search">
        <HBox.margin>
            <Insets left="10" />
        </HBox.margin>
    </TextField>

    <Button text="查询" onAction="#searchBtn">
        <HBox.margin>
            <Insets left="10" right="10"/>
        </HBox.margin>
    </Button>

    <Button text="删除" onAction="#deleteBtn">
        <HBox.margin>
            <Insets right="10"/>
        </HBox.margin>
    </Button>

    <Button text="添加" onAction="#addBtn">
    </Button>
</HBox>

<TableView styleClass="table-view"
           fx:id="bookTable" AnchorPane.leftAnchor="10" AnchorPane.topAnchor="70" prefHeight="287" prefWidth="680">
    <columns>
        <TableColumn text="编号" prefWidth="40">
            <cellValueFactory>
                <PropertyValueFactory property="id"/>
            </cellValueFactory>
        </TableColumn>

        <TableColumn text="书名"  prefWidth="100">
            <cellValueFactory>
                <PropertyValueFactory property="bookName"/>
            </cellValueFactory>
        </TableColumn>

        <TableColumn text="作者">
            <cellValueFactory>
                <PropertyValueFactory property="author"/>
            </cellValueFactory>
        </TableColumn>

        <TableColumn text="价格">
            <cellValueFactory>
                <PropertyValueFactory property="price"/>
            </cellValueFactory>
        </TableColumn>

        <TableColumn text="库存">
            <cellValueFactory>
                <PropertyValueFactory property="stock"/>
            </cellValueFactory>
        </TableColumn>

        <TableColumn text="出版社" prefWidth="130">
            <cellValueFactory>
                <PropertyValueFactory property="publisher"/>
            </cellValueFactory>
        </TableColumn>
    </columns>
</TableView>

<FlowPane AnchorPane.leftAnchor="150" AnchorPane.bottomAnchor="20" hgap="20" alignment="CENTER">
    <Text fx:id="searchCount"/>
    <Text fx:id="searchPage" text="第1页"/>
    <Button onAction="#start" text="首页"/>
    <Button onAction="#up" text="上一页"/>
    <Button onAction="#next" text="下一页"/>
    <Button onAction="#end" text="尾页"/>
</FlowPane>

<stylesheets>
    <URL value="@houtai.css"/>
</stylesheets>


> 
> show.fxml
> 
> 
> 




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/a7ba02d3019677d25d2b2b971b966343.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

tory property="price"/>
                </cellValueFactory>
            </TableColumn>

            <TableColumn text="库存">
                <cellValueFactory>
                    <PropertyValueFactory property="stock"/>
                </cellValueFactory>
            </TableColumn>

            <TableColumn text="出版社" prefWidth="130">
                <cellValueFactory>
                    <PropertyValueFactory property="publisher"/>
                </cellValueFactory>
            </TableColumn>
        </columns>
    </TableView>

    <FlowPane AnchorPane.leftAnchor="150" AnchorPane.bottomAnchor="20" hgap="20" alignment="CENTER">
        <Text fx:id="searchCount"/>
        <Text fx:id="searchPage" text="第1页"/>
        <Button onAction="#start" text="首页"/>
        <Button onAction="#up" text="上一页"/>
        <Button onAction="#next" text="下一页"/>
        <Button onAction="#end" text="尾页"/>
    </FlowPane>

    <stylesheets>
        <URL value="@houtai.css"/>
    </stylesheets>
</AnchorPane>

show.fxml

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-kPDOCb5a-1713375494103)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图书管理系统一个使用JavaFX的应用程序,它用于管理图书的增删改查等功能。在该系统中,有一些特定的界面需要加载和初始化。在MainApp.java文件中,有两个方法用于加载不同的界面,分别是initBookTypeManageFrame和initBookAddFrame。 这两个方法使用FXMLLoader来加载对应的FXML文件,并返回一个AnchorPane对象,以便其他控件调用。其中,initBookTypeManageFrame方法加载的是图书类别维护界面的FXML文件,而initBookAddFrame方法加载的是图书添加界面的FXML文件。 另外,在BookAddFrameController.java文件中,还有一个名为initialize的方法。这个方法用于初始化界面控件的数据。在该方法中,首先通过simpleTools.setLabeledImage方法为按钮添加图标,然后通过执行SQL语句获取所有的图书类别数据,并将其存储在一个列表中。接着,通过simpleTools.addComboBoxItems方法初始化下拉列表框的选项,将所有的图书类别名称添加到下拉列表框中。 综上所述,图书管理系统使用JavaFX,通过加载相应的FXML文件来展示界面,并通过初始化方法来设置界面控件的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java实战之图书管理系统JavaFX版)(7)——图书类别维护界面及功能实现](https://blog.csdn.net/cnds123321/article/details/103980308)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java实战之图书管理系统JavaFX版)(8)——图书添加界面及功能实现](https://blog.csdn.net/cnds123321/article/details/103980999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值