圖書管理系統總結——用戶主界面實現(二)


一、功能界面切換

右邊操作一共有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;                                        
                }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM