一、功能界面切換
右邊操作一共有5個不同的界面,每一個界面分別置於一個底層容器Jpanel上。置於如何切換不同界面,我沒有找到什么好方法,設置一個標記變量,然后左邊點擊不同導航按鈕時候,在響應函數里面更換標記,再重新刷新。
類成員變量設置:
//根據左邊按鈕選擇顯示哪一個界面 //1是查詢,2是當前借閱,3是歷史借閱信息,4是證件信息,5是推薦 private int ShowSelect=1;
刷新函數設置:
public void FreshShow() { // booktypeJcb = new JComboBox(); // booktypeJcb.setFont(new Font("宋體", Font.PLAIN, 35)); //********************選擇右邊顯示的界面*******************************/ switch(ShowSelect) { case 1: splitPane.add(OperationJp, JSplitPane.RIGHT); CredentialInfoJP.setVisible(false); PreBorrowJP.setVisible(false); RecomJP.setVisible(false); HisBorrowJP.setVisible(false); OperationJp.setVisible(true); break; case 2: splitPane.setRightComponent(PreBorrowJP); CredentialInfoJP.setVisible(false); OperationJp.setVisible(false); RecomJP.setVisible(false); HisBorrowJP.setVisible(false); PreBorrowJP.setVisible(true); break; case 3: splitPane.setRightComponent(HisBorrowJP); CredentialInfoJP.setVisible(false); OperationJp.setVisible(false); RecomJP.setVisible(false); PreBorrowJP.setVisible(false); HisBorrowJP.setVisible(true); break; case 4: splitPane.setRightComponent(CredentialInfoJP); OperationJp.setVisible(false); RecomJP.setVisible(false); PreBorrowJP.setVisible(false); HisBorrowJP.setVisible(false); CredentialInfoJP.setVisible(true); break; default:splitPane.setRightComponent(RecomJP); CredentialInfoJP.setVisible(false); PreBorrowJP.setVisible(false); OperationJp.setVisible(false); HisBorrowJP.setVisible(false); RecomJP.setVisible(true); break; } }
類構造函數在按鈕響應函數調用,例如:
RecomJB.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ResetValue(); ShowSelect=5; FreshShow(); //刷新界面 } });
這里記住一件事情:所有的界面在構造函數執行以后已經生成好了,只是沒有setVisible(true),這里刷新只是根據條件顯示不同面板。這也是使用底層容器,做到分類放置不同控件的好處。
二、查詢界面實現
所有的界面都差不多,以查詢界面為例。
首先放置一個JcomboBox用於在bookType關系表里面將所有的圖書類型顯示出來,提供條件查詢一個變量。然后放置一個Jtxt作為書名輸入,作為條件查詢主鍵。再放一個按鈕和一張Jtable用於顯示查詢結果。如前面所說,Jtable位於JscrollPanel內,用於滾動列表:
JButton SearchBookJB = new JButton("\u67E5\u8BE2"); //按鈕響應事件,點擊后執行查詢 SearchBookJB.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { BookSearchActionPerformed(evt); } }); SearchBookJB.setIcon(new ImageIcon(userMainFrm.class.getResource("/manager/image/search.png"))); SearchBookJB.setFont(new Font("宋體", Font.PLAIN, 35)); //JScrollPane用於放置表格 JScrollPane BookSearchJsp = new JScrollPane(); GroupLayout gl_OperationJp = new GroupLayout(OperationJp); //布局 gl_OperationJp.setHorizontalGroup( gl_OperationJp.createParallelGroup(Alignment.LEADING) .addGroup(gl_OperationJp.createSequentialGroup() .addGap(159) .addGroup(gl_OperationJp.createParallelGroup(Alignment.TRAILING, false) .addComponent(BookSearchJsp, Alignment.LEADING) .addGroup(Alignment.LEADING, gl_OperationJp.createSequentialGroup() .addComponent(booktypeJcb, GroupLayout.PREFERRED_SIZE, 269, GroupLayout.PREFERRED_SIZE) .addGap(74) .addComponent(BookNameJL, GroupLayout.PREFERRED_SIZE, 162, GroupLayout.PREFERRED_SIZE) .addPreferredGap(ComponentPlacement.UNRELATED) .addComponent(BookNameTxt, GroupLayout.PREFERRED_SIZE, 1112, GroupLayout.PREFERRED_SIZE) .addGap(89) .addComponent(SearchBookJB, GroupLayout.PREFERRED_SIZE, 208, GroupLayout.PREFERRED_SIZE))) .addContainerGap(945, Short.MAX_VALUE)) ); gl_OperationJp.setVerticalGroup( gl_OperationJp.createParallelGroup(Alignment.LEADING) .addGroup(gl_OperationJp.createSequentialGroup() .addGap(131) .addGroup(gl_OperationJp.createParallelGroup(Alignment.BASELINE) .addComponent(booktypeJcb, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE) .addComponent(BookNameJL, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE) .addComponent(BookNameTxt, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE) .addComponent(SearchBookJB, GroupLayout.PREFERRED_SIZE, 75, GroupLayout.PREFERRED_SIZE))//修改第四個參數可以改大小 .addGap(111) .addComponent(BookSearchJsp, GroupLayout.PREFERRED_SIZE, 1017, GroupLayout.PREFERRED_SIZE) .addContainerGap(409, Short.MAX_VALUE)) ); //放置表格 BookSearchJT = new JTable(); //表格行選中事件,用於將選中的那一行數據導入,用於后面的借閱功能指明借閱哪本書 BookSearchJT.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { bookSearchJTMousePressed(e); } }); //表格模式設置,也就是最上方有幾列,以及各自列名是什么 BookSearchJT.setModel(new DefaultTableModel( new Object[][] { }, new String[] { "圖書ID","\u56FE\u4E66\u540D\u79F0", "\u56FE\u4E66\u4F5C\u8005", "\u51FA\u7248\u793E", "\u56FE\u4E66\u63CF\u8FF0", "\u5269\u4F59\u672C\u6570" } ) { boolean[] columnEditables = new boolean[] { false, false, false, false, false }; @Override public boolean isCellEditable(int row, int column) { return columnEditables[column]; } }); BookSearchJT.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //修改表頭大小和字體大小,用於適應我的高分辨率屏幕 BookSearchJT.getTableHeader().setPreferredSize(new Dimension((int)(1*enlargement_x),(int)(40*enlargement_y))); BookSearchJT.getTableHeader().setFont(new Font("宋體", Font.PLAIN, (int)(35*enlargement_y))); BookSearchJT.setRowHeight((int)(80*enlargement_y)); BookSearchJT.getColumnModel().getColumn(0).setPreferredWidth(200); BookSearchJT.getColumnModel().getColumn(1).setPreferredWidth(266); BookSearchJT.getColumnModel().getColumn(2).setPreferredWidth(217); BookSearchJT.getColumnModel().getColumn(3).setPreferredWidth(285); BookSearchJT.getColumnModel().getColumn(4).setPreferredWidth(523); BookSearchJT.getColumnModel().getColumn(5).setPreferredWidth(249); //表格里面字體設置 BookSearchJT.setFont(new Font("宋體", Font.PLAIN, 35)); //BookSearchJsp.add(BookSearchJT); BookSearchJsp.setViewportView(BookSearchJT); OperationJp.setLayout(gl_OperationJp);
下面重點來了——導入表格數據
//************************初始化表格數據**************************************/ /** * 初始化表格數據 * @param book */ private void fillTable(Book book) { DefaultTableModel dtm=(DefaultTableModel) BookSearchJT.getModel();//獲取模型 dtm.setRowCount(0); // 設置成0行 Connection con=null; try{ con=dbUtil.getCon(); //OperationJp ResultSet rs=bookDao.list(con, book);//根據條件查詢,獲取所有記錄 while(rs.next()){ Vector v=new Vector();//一定按表格所顯示的順序寫,填入每一個數據項 v.add(rs.getString("id")); v.add(rs.getString("bookName")); v.add(rs.getString("author")); v.add(rs.getString("publisher")); v.add(rs.getString("bookDesc")); v.add(rs.getString("number")); dtm.addRow(v);//加一行 } }catch(Exception e){ e.printStackTrace(); }finally{ try { dbUtil.closeCon(con); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
導入下拉框的數據。不過要說明一點,下拉框第一個選項設置為“請選擇.."用於提示,這個時候ID=-1,也用於之后查詢時候判斷有沒有輸入圖書類別這一條件。如果發現JcombBox選中的ID=-1,說明沒有這個條件:
/** * 初始化圖書類別下拉框 */ private void fillBookType(){ Connection con=null; BookType bookType=null; try{ con=dbUtil.getCon();//與數據庫建立連接 ResultSet rs=bookTypeDao.list(con, new BookType());//查詢bookType表格,列出所有信息 //添加第一項ID=-1 bookType=new BookType(); bookType.setBookTypeName("請選擇..."); bookType.setId(-1);//請選擇的ID為-1 BookTypeJcb.addItem(bookType);//按順序添加到下拉框中 while(rs.next()) { bookType=new BookType(); bookType.setId(rs.getInt("id"));//下拉框每一選項的ID,只用於后台標識 bookType.setBookTypeName(rs.getString("bookTypeName"));//下拉框中每一行顯示的內容就是圖書類別的名字 this.booktypeJcb.addItem(bookType);//添加項 BookTypeJcb.addItem(bookType); } }catch(Exception e){ e.printStackTrace(); }finally{ } }
(附注:
若要清空表格數據:
//清空表格 DefaultTableModel model =(DefaultTableModel) bookTable.getModel(); while(model.getRowCount()>0) { model.removeRow(model.getRowCount()-1);
}
同理,清空下拉框數據:
if(this.bookTypeJCB.getItemCount()>0)//圖書類別項大於0,才操作 { this.bookTypeJCB.setSelectedIndex(0);//選中第一項 }
)
圖書檢索按鈕的響應函數:
private void BookSearchActionPerformed(ActionEvent evt) { String bookName=this.BookNameTxt.getText();//從輸入框獲得圖書名稱 //String author=this.S_AuthorTxt.getText(); BookType bookType=(BookType) this.booktypeJcb.getSelectedItem();//獲得選中了哪一個圖書類別。返回object類,強轉 int bookTypeId=bookType.getId(); Book book=new Book(bookName,bookTypeId); this.fillTable(book); //刷新表格 }
關於如何檢索圖書類別表格,如何根據不同條件檢索圖書,專門放在后面寫一個JDBC有關數據庫操作總結。
三、其他版面的界面:
基本原理都差不多,不再記錄。借閱歷史中有兩張統計圖,之后再說。
關於“證件信息”界面中還有個繳納費用按鈕。為了保證並發操作性,要求只能打開一個繳納費用窗口。所以我在類中設置一個標記變量,標記是否點擊過這個按鈕,點擊過后設為true。但是如何置會比較麻煩,因為執行到打開繳納費用窗口時候主函數並不停下了,而是執行完畢,那個窗口是另一個線程。按道理要加一個監聽,觀察什么時候繳納費用窗口關閉了再置回。但是我不會,沒空仔細研究。只好采用將這個變量傳到繳納窗口這一個Jframe的繼承類中,由那邊退出響應按鈕置回:
/** * 繳納罰款 * @param pay */ private void payactionPerformed(ActionEvent pay) { // TODO Auto-generated method stub if(IsOpened) { Dialogutil attention=new Dialogutil(null,"Attention!","已經打開該窗口!"); return; } else { if(StringUtil.isEmpty(PresentUser)) { Dialogutil attention=new Dialogutil(null,"Attention!","用戶信息獲取失敗!"); return; } else { this.payfrm=new PayFrm(PresentUser,this); payfrm.setVisible(true); IsOpened=true; } } }
關於PayFrm類,也就是繳納窗口,在充值成功退出前置回標記變量:
//修改用戶余額 user.setBalance(payNum); int num=UserDao.Recharge(con, user); if(pay==1&&num==1) { showMessageFrame SucNote=new showMessageFrame(null,"繳納費用成功!",showMessageFrame.NORMAL); dispose(); this.userMainFrm.balanceTxt.setText(Float.toString(user.getBalance())); this.userMainFrm.IsOpened=false;//還原標記變量 return; }