Swing章節學習總結之圖書庫存案例

在進行數據庫設計時,數據庫中每一個表對應Java一個實體類,實體類是系統的“人”、“事”、“物”等一些名詞,例如圖書(Book)就是一個實體類了,實體類Book代碼如下:
第一步:編寫實體類

//圖書實體類
public class Book {
//    圖書編號
    private String bookid;
//    圖書名稱
    private String bookname;
//    圖書作者
    private String author;
//    出版社
    private String publisher;
//    出版日期
    private String pubtime;
//    庫存數量
    private int inventory;

    public String getBookid(){
        return bookid;
    }
    public void setBookid(String bookid){
        this.bookid = bookid;
    }

    public String getBookname(){
        return bookname;
    }
    public void setBookname(String bookname){
        this.bookname = bookname;
    }

    public String getAuthor(){
        return author;
    }
    public void setAuthor(String author){
        this.author = author;
    }

    public String getPublisher(){
        return publisher;
    }
    public void setPublisher(String publisher){
        this.publisher = publisher;
    }

    public String getPubtime(){
        return pubtime;
    }
    public void setPubtime(String pubtime){
        this.pubtime = pubtime;
    }

    public int getInventory() {
        return inventory;
    }
    public void setInventory(int inventory) {
        this.inventory = inventory;
    }
}

由於這裏沒有涉及到數據庫,這裏的數據是JSON文件中的數據,內容如下:

[{"bookid":"0036","bookname": "高等數學", "author":"李放", "publisher":"人民郵電出版社", "pubtime":"20000812","inventory": 1},
{"bookid":"0004","bookname": "FLASH精選","author": "劉揚","publisher": "中國紡織出版社",  "pubtime":"19990312", "inventory":2},
{"bookid":"0026", "bookname":"軟件工程", "author":"牛田", "publisher":"經濟科學出版社", "pubtime": "20000328", "inventory":4},
{"bookid":"0015","bookname": "人工智能","author": "周未", "publisher":"機械工業出版社", "pubtime": "19991223", "inventory":3},
{"bookid":"0032","bookname": "SOL使用手冊","author": "賀民","publisher": "電子工業出版社", "pubtime": "19990425", "inventory":2},
{"bookid":"0031","bookname":"python數據分析","author":"張俊紅","publisher":"電子工業出版社", "pubtime":"19990426","inventory":10},
{"bookid":"0045","bookname":"深入理解Java虛擬機","author":"周志名","publisher":"機械工業出版社", "pubtime":"20100323","inventory":23}]

從上面可知,整個文檔是JSON數組,數組中的每一個元素是JSON對象

第二步:編寫解析JSON文檔代碼:

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author : 蔡政潔
 * @email :[email protected]
 * @date : 2020/2/25
 * @time : 5:33 下午
 */

public class HelloWorld {
    public static void main(String[] args) {
        List<Book> data = readData();
        MyFrameTable myFrameTable = new MyFrameTable("圖書庫存", data);

    }
//    從文件中讀取數據
    private static List<Book> readData(){
//        返回的數據列表
        List<Book> list = new ArrayList<Book>();
//        數據文件
        String file = "/Users/caizhengjie/IdeaProjects/Java學習/src/Swing圖形用戶界面/圖書庫存案例/Books.json";

        try(FileInputStream fis = new FileInputStream(file);
            InputStreamReader ir = new InputStreamReader(fis);
            BufferedReader in = new BufferedReader(ir)
        ) {
//            1.讀取文件
            StringBuilder stringBuilder = new StringBuilder();
            String line = in.readLine();

            while (line !=null) {
                stringBuilder.append(line);
                line = in.readLine();
            }

//           2.JSON解碼
//            讀取JSON字符完成
            System.out.println("讀取JSON字符完成");
//            JSON解碼,解碼成功返回JSON數組
            JSONArray jsonArray = new JSONArray(stringBuilder.toString());
            System.out.println("解碼JSON字符完成");

//            3.將JSON數組放到List<Book>集合中
//            遍歷集合
            for (Object item:jsonArray){
                JSONObject row = (JSONObject) item;

                Book book  = new Book();
                book.setBookid((String) row.get("bookid"));
                book.setBookname((String) row.get("bookname"));
                book.setAuthor((String) row.get("author"));
                book.setPublisher((String) row.get("publisher"));
                book.setPubtime((String) row.get("pubtime"));
                book.setInventory((Integer) row.get("inventory"));

                list.add(book);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
}

上述代碼處理過程,經歷了三個步驟:主要的過程:

  • 讀取文件:通過Java IO取得文件./db/Books.json,每次讀取的字符串保存到StringBuilder 的sbuilder對象中。文件讀完sbuilder中就是全部的JSON字符串。
  • JSON解碼:讀取JSON字符完成後,需要對其進行解碼。由於JSON字符串是數組結構,因此解 碼時候使用JSONArray,創建JSONArray對象過程就是對字符串進行解碼的過程,如果沒有發生 異常,說明成功解碼。
  • 將JSON數組放到List集合中:本例表格使用的數據格式不是JSON數組形式,而是 List,這種結構就是List集合中每一個元素都是Book類型。這個過程需要遍歷JSON數 組,把數據重新組裝到Book對象中。

第三步:自定義的表格模型,它繼承了抽象類AbstractTableModel類

抽象類 AbstractTableModel要求必須實現getColumnCount()、getRowCount()和getValueAt()三個抽象方法, getColumnCount()方法提供表格列數,getRowCount()方法提供表格的行數,getValueAt()方法提供了指 定行和列時單元格內容。代碼getColumnName()方法不是抽象類要求實現的方法,重寫該方法能夠給表格提供有意義的列名。

import javax.swing.table.AbstractTableModel;
import java.util.List;

/**
 * @author : 蔡政潔
 * @email :[email protected]
 * @date : 2020/2/25
 * @time : 7:30 下午
 */
//通過模型創建表格
public class BookTableModel extends AbstractTableModel {

//   列名數組
    private String[] columnNames = {"書籍編號","書籍名稱","作者","出版社","出版日期","庫存數量"};
//    data保存了表格中的數據,data類型是list集合
    private List<Book> data = null;

    public BookTableModel(List<Book> data){
        this.data = data;
    }
//獲得行數
    @Override
    public int getRowCount() {
        return data.size();
    }
//獲得列數
    @Override
    public int getColumnCount() {
        return columnNames.length;
    }
//獲取某行某列的數據
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Book book = (Book) data.get(rowIndex);
        switch (columnIndex){
            case 0:
                return book.getBookid();
            case 1:
                return book.getBookname();
            case 2:
                return book.getAuthor();
            case 3:
                return book.getPublisher();
            case 4:
                return book.getPubtime();
            case 5:
                return book.getInventory();
        }
        return null;
    }
//    獲得某列的名字
    @Override
    public String getColumnName(int col){
        return columnNames[col];
    }
}

第四步:編寫窗口代碼

import java.util.List;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableModel;
import java.awt.*;

/**
 * @author : 蔡政潔
 * @email :[email protected]
 * @date : 2020/2/25
 * @time : 7:47 下午
 */
public class MyFrameTable extends JFrame {
    //    獲得當前屏幕的寬和高
    private double screenWidth = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
    private double screenHight = Toolkit.getDefaultToolkit().getScreenSize().getWidth();

    private JTable table;
//    圖書列表
    private List<Book> data;
    public MyFrameTable(String title, List<Book> data){
        super(title);

        this.data = data;
        TableModel  model = new BookTableModel(data);

        table = new JTable(model);
//        設置表格中內容字體
        table.setFont(new Font("微軟雅黑",Font.PLAIN,16));
//        設置表列標題字體
        table.getTableHeader().setFont(new Font("微軟雅黑",Font.BOLD,16));
//        設置行高
        table.setRowHeight(40);
//        設置爲單行選中模式
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//        返回當前行的狀態模型
        ListSelectionModel rowSM = table.getSelectionModel();
//        註冊監聽器,選中行發生更改時觸發,這裏採用匿名內部類
        rowSM.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
//                只處理鼠標按下
                if (e.getValueIsAdjusting() == false){
                    return;
                }
                ListSelectionModel lsm = (ListSelectionModel) e.getSource();
                if (lsm.isSelectionEmpty()){
                    System.out.println("沒有選中行");
                }
                else {
                    int selectedRow = lsm.getMinSelectionIndex();
                    System.out.println("第"+selectedRow+"行被選中");
                }
            }
        });
//        創建一個滾動面板jScrollPane
        JScrollPane jScrollPane = new JScrollPane();
//        把表格添加到滾動面板上
        jScrollPane.setViewportView(table);
        getContentPane().add(jScrollPane,BorderLayout.CENTER);

//        設置窗口大小
        setSize(960,640);
//        計算窗口位於屏幕中心的座標
        int x = (int) (screenWidth-960) /2;
        int y = (int) (screenHight-960) /2;

//        設置窗口位於屏幕中心的座標
        setLocation(x,y);
//        設置窗口可見
        setVisible(true);
    }
}

運行結果:
在這裏插入圖片描述
以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!

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