在進行數據庫設計時,數據庫中每一個表對應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);
}
}
運行結果:
以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!