目錄結構java
代碼sql
/圖書管理系統10.23/src/com/fry/model/Book.java數據庫
1 package com.fry.model; 2 3 public class Book { 4 private int bookNum; 5 private String bookName; 6 private String author; 7 private String publishment; 8 private String buyTime; 9 private String borrowed; 10 private String Ordered; 11 12 13 public int getBookNum() { 14 return bookNum; 15 } 16 public void setBookNum(int bookNum) { 17 this.bookNum = bookNum; 18 } 19 public String getBookName() { 20 return bookName; 21 } 22 public void setBookName(String bookName) { 23 this.bookName = bookName; 24 } 25 public String getAuthor() { 26 return author; 27 } 28 public void setAuthor(String author) { 29 this.author = author; 30 } 31 public String getPublishment() { 32 return publishment; 33 } 34 public void setPublishment(String publishment) { 35 this.publishment = publishment; 36 } 37 public String getBuyTime() { 38 return buyTime; 39 } 40 public void setBuyTime(String buyTime) { 41 this.buyTime = buyTime; 42 } 43 public String getBorrowed() { 44 return borrowed; 45 } 46 public void setBorrowed(String borrowed) { 47 this.borrowed = borrowed; 48 } 49 public String getOrdered() { 50 return Ordered; 51 } 52 public void setOrdered(String ordered) { 53 Ordered = ordered; 54 } 55 56 57 58 }
/圖書管理系統10.23/src/com/fry/model/Database.javaide
1 package com.fry.model; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.util.Map; 9 import java.util.Vector; 10 11 public class Database { 12 PreparedStatement ps = null; // (這裏也可使用statement,視狀況而定) 13 Connection ct = null; 14 ResultSet rs = null; 15 16 public Database() { 17 try { 18 // 1.加載驅動 19 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 20 String url = "jdbc:sqlserver://localhost:1433;databaseName=libraryManagement"; 21 String user = "sa";// sa超級管理員 22 String password = "1314";// 密碼 23 24 // 2.鏈接 25 ct = DriverManager.getConnection(url, user, password); 26 } catch (Exception e) { 27 e.printStackTrace(); 28 } 29 30 } 31 32 // 查詢 33 /** 34 * 參數的話,應該是要一個sql,一個map的參數 返回的話,就是一個Vector<Vector> 35 */ 36 public Vector<Vector> query(String sql,Map<String,String> args,int n) { 37 try { 38 // 3.建立發送端 39 ps = ct.prepareStatement(sql); 40 // 4.獲取結果集 41 ps.setString(1, args.get("BookNO")); 42 rs = ps.executeQuery(); 43 // 遍歷輸出結果集 44 Vector<Vector> data=new Vector<Vector>(); 45 while (rs.next()) { 46 Vector record=new Vector(); 47 //System.out.println(args.size()); 48 for(int i=1;i<=n;i++){ 49 String str=rs.getString(i)+""; 50 record.add(str); 51 //System.out.print(str+" "); 52 } 53 data.add(record); 54 //System.out.println(); 55 } 56 return data; 57 } catch (SQLException e) { 58 e.printStackTrace(); 59 } 60 return null; 61 } 62 63 public Vector<Vector> query(String sql) { 64 try { 65 // 3.建立發送端 66 ps = ct.prepareStatement(sql); 67 // 4.獲取結果集 68 rs = ps.executeQuery(); 69 // 遍歷輸出結果集 70 Vector<Vector> data=new Vector<Vector>(); 71 while (rs.next()) { 72 Vector record=new Vector(); 73 for(int i=1;i<=7;i++){ 74 String str=rs.getString(i)+""; 75 record.add(str); 76 //System.out.print(str+" "); 77 } 78 data.add(record); 79 //System.out.println(); 80 } 81 return data; 82 } catch (SQLException e) { 83 e.printStackTrace(); 84 } 85 return null; 86 } 87 88 public void connectDB(String sql, String args[]) { 89 try { 90 // 1.加載驅動 91 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 92 String url = "jdbc:sqlserver://localhost:1433;databaseName=libraryManagement"; 93 String user = "sa";// sa超級管理員 94 String password = "1314";// 密碼 95 96 // 2.鏈接 97 ct = DriverManager.getConnection(url, user, password); 98 99 // 3.建立發送端 100 101 ps = ct.prepareStatement("select * from book"); 102 // 4.獲取結果集 103 rs = ps.executeQuery(); 104 // 經過PreparedStatement對象裏的set方法去設置插入的具體數值 105 106 // pstmt.setString(1, newen); 107 108 // 遍歷輸出結果集 109 while (rs.next()) { 110 String str=null; 111 //str=rs.getString("BookNO"); 112 str=rs.getString(1); 113 System.out.println(str); 114 115 } 116 } catch (Exception e) { 117 e.printStackTrace(); 118 } finally { 119 120 // 關閉資源,增強程序的健壯性 121 try { 122 if (rs != null) { 123 rs.close(); 124 } 125 if (ps != null) { 126 ps.close(); 127 } 128 if (ct != null) { 129 ct.close(); 130 } 131 } catch (Exception e) { 132 e.printStackTrace(); 133 } 134 } 135 136 } 137 }
/圖書管理系統10.23/src/com/fry/view/StudentSystem.java函數
1 package com.fry.view; 2 3 import java.awt.*; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 7 import javax.swing.*; 8 import javax.swing.event.TreeSelectionEvent; 9 import javax.swing.event.TreeSelectionListener; 10 import javax.swing.tree.DefaultMutableTreeNode; 11 12 13 public class StudentSystem extends JFrame implements TreeSelectionListener{ 14 //屬性 15 //左邊 16 private JTree tree; 17 private DefaultMutableTreeNode root; 18 private DefaultMutableTreeNode treeNode1; 19 private DefaultMutableTreeNode treeNode2; 20 private DefaultMutableTreeNode treeNode3; 21 private DefaultMutableTreeNode treeNode4; 22 //給樹添加滾動條 23 private JScrollPane scrollPane; 24 25 //整體 26 private JSplitPane splitPane; 27 28 //右邊 29 private JPanel panel; 30 //給panel添加一個cardLayout 31 private CardLayout cardLayout; 32 private JLabel label; 33 //用來設置右邊cardLayout的替代品 34 private JLabel label_1; 35 private JLabel label_2; 36 private JLabel label_3; 37 38 //底部 39 //給底部設置一個標籤文本 40 41 42 public StudentSystem(){ 43 initTree();//左 44 initPanel();//右 45 initSplitPane();//總 46 initFrame(); 47 } 48 49 50 public void initTree(){ 51 root=new DefaultMutableTreeNode("學生用戶管理系統"); 52 treeNode1=new DefaultMutableTreeNode("查詢圖書"); 53 treeNode2=new DefaultMutableTreeNode("預定圖書"); 54 treeNode3=new DefaultMutableTreeNode("掛失圖書"); 55 treeNode4=new DefaultMutableTreeNode("退出"); 56 root.add(treeNode1); 57 root.add(treeNode2); 58 root.add(treeNode3); 59 root.add(treeNode4); 60 //先建好節點,而後把節點加入樹中 61 tree=new JTree(root); 62 //顯示了root節點上面的小鑰匙 63 tree.setShowsRootHandles(true); 64 //給樹添加滾動條 65 scrollPane=new JScrollPane(tree); 66 //添加事件監聽 67 tree.addTreeSelectionListener(this); 68 69 } 70 71 72 73 public void initSplitPane(){ 74 splitPane=new JSplitPane(); 75 splitPane.setLeftComponent(scrollPane); 76 splitPane.setRightComponent(panel); 77 //設置分割線寬度,大了太醜了 78 splitPane.setDividerSize(4); 79 splitPane.setDividerLocation(150); 80 } 81 82 public void initPanel(){ 83 panel=new JPanel(); 84 cardLayout=new CardLayout(); 85 panel.setLayout(cardLayout); 86 panel.setBounds(200,50,300,400); 87 label=new JLabel("歡迎來到學生管理界面"); 88 label.setHorizontalAlignment(JLabel.CENTER); 89 label.setVerticalAlignment(JLabel.CENTER); 90 panel.add(label, "root"); 91 92 //替代品 93 label_1=new JLabel("查詢圖書"); 94 label_2=new JLabel("預定圖書"); 95 label_3=new JLabel("掛失圖書"); 96 panel.add(new SearchBook(), "findBook"); 97 panel.add(label_2, "orderBook"); 98 panel.add(label_3, "loseBook"); 99 100 } 101 public void initFrame(){ 102 this.add(splitPane); 103 int width=500; 104 int height=400; 105 this.setSize(width, height); 106 this.setTitle("學生管理系統"); 107 this.setVisible(true); 108 this.setExtendedState(JFrame.MAXIMIZED_BOTH); 109 this.setDefaultCloseOperation(EXIT_ON_CLOSE); 110 } 111 112 113 public void valueChanged(TreeSelectionEvent e) { 114 DefaultMutableTreeNode tmpNode=(DefaultMutableTreeNode) e.getPath().getLastPathComponent(); 115 String chooseName=(String) tmpNode.getUserObject(); 116 if(chooseName.equals("學生用戶管理系統")){ 117 cardLayout.show(panel, "root"); 118 }else if(chooseName.equals("查詢圖書")){ 119 cardLayout.show(panel, "findBook"); 120 }else if(chooseName.equals("預定圖書")){ 121 cardLayout.show(panel, "orderBook"); 122 }else if(chooseName.equals("掛失圖書")){ 123 cardLayout.show(panel, "loseBook"); 124 }else if(chooseName.equals("退出")){ 125 int i=JOptionPane.showConfirmDialog(StudentSystem.this, "是否退出系統?","消息",JOptionPane.YES_NO_OPTION); 126 if(i==JOptionPane.YES_OPTION){ 127 System.exit(0); 128 } 129 } 130 } 131 132 public static void main(String[] args){ 133 new StudentSystem(); 134 } 135 136 137 138 139 140 141 142 }
/圖書管理系統10.23/src/com/fry/view/SearchBook.javasqlserver
1 package com.fry.view; 2 3 import java.awt.GridLayout; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.util.Vector; 7 8 import javax.swing.*; 9 import javax.swing.table.DefaultTableModel; 10 11 import com.fry.model.Database; 12 13 public class SearchBook extends JPanel implements ActionListener{ 14 //上 15 private JPanel panelUp; 16 //簡單查詢和高級查詢按鈕 17 private ButtonGroup buttonGroup; 18 private JRadioButton radioButton1; 19 private JRadioButton radioButton2; 20 //書名,做者,出版社 21 private JLabel label1; 22 private JLabel label2; 23 private JLabel label3; 24 //書名,做者,出版社後面對應的輸入框 25 private JTextField textField1; 26 private JTextField textField2; 27 private JTextField textField3; 28 //簡單查詢中的下拉列表框 29 private JComboBox comboBox; 30 private JTextField textField4; 31 //肯定按鈕 32 private JButton button; 33 34 //下 35 private DefaultTableModel defaultTableModel; 36 private JTable table; 37 private JScrollPane scrollPane; 38 //數據庫部分 39 Vector<String> head;//表頭 40 Database database; 41 String sql = null; 42 43 44 //總 45 private JSplitPane splitPane; 46 47 48 public SearchBook(){ 49 50 initPanelUp(); 51 initTabel(); 52 initSplitPane(); 53 initPanel(); 54 } 55 56 //總體的那個panel,this指代的那個 57 public void initPanel(){ 58 this.setLayout(new GridLayout(1,1));//設置查詢圖書界面爲網格佈局 59 this.add(splitPane); 60 this.setVisible(true); 61 this.setBounds(3, 100, 600, 400); 62 } 63 64 //上面的panel 65 public void initPanelUp(){ 66 panelUp=new JPanel(); 67 panelUp.setSize(600, 500); 68 panelUp.setLayout(null); 69 70 //簡單查詢和高級查詢按鈕 71 buttonGroup=new ButtonGroup(); 72 radioButton1 = new JRadioButton("簡單查詢",true); 73 radioButton2 = new JRadioButton("高級查詢"); 74 radioButton1.setBounds(20, 20, 100, 20); 75 radioButton2.setBounds(20, 60, 100, 20); 76 radioButton1.addActionListener(this); 77 radioButton2.addActionListener(this); 78 buttonGroup.add(radioButton1); 79 buttonGroup.add(radioButton2); 80 panelUp.add(radioButton1); 81 panelUp.add(radioButton2); 82 83 //書名,做者,出版社 84 label1=new JLabel("書名"); 85 label2=new JLabel("做者"); 86 label3=new JLabel("出版社"); 87 label1.setBounds(120,60, 80, 20); 88 label2.setBounds(320,60, 80, 20); 89 label3.setBounds(520,60, 80, 20); 90 panelUp.add(label1); 91 panelUp.add(label2); 92 panelUp.add(label3); 93 //書名,做者,出版社後面對應的輸入框 94 textField1=new JTextField(); 95 textField2=new JTextField(); 96 textField3=new JTextField(); 97 textField1.setBounds(155,60, 80, 20); 98 textField2.setBounds(355,60, 80, 20); 99 textField3.setBounds(565,60, 80, 20); 100 panelUp.add(textField1); 101 panelUp.add(textField2); 102 panelUp.add(textField3); 103 //設置複雜查詢的三個文本框爲false 104 textField1.setEditable(false); 105 textField2.setEditable(false); 106 textField3.setEditable(false); 107 108 //簡單查詢中的下拉列表框 109 String[] str={"書名","出版社","做者","購買時間"}; 110 comboBox=new JComboBox(str); 111 comboBox.setBounds(120, 20, 150, 20); 112 textField4=new JTextField(); 113 textField4.setBounds(285,20, 150, 20); 114 textField4.requestFocus(); 115 panelUp.add(comboBox); 116 panelUp.add(textField4); 117 118 //肯定按鈕 119 button=new JButton("提交"); 120 button.setBounds(520, 20, 150, 20); 121 button.addActionListener(this); 122 panelUp.add(button); 123 } 124 125 //下面的Tabel 126 public void initTabel(){ 127 //表頭部分 128 head=new Vector<String>(); 129 head.add("書號"); 130 head.add("書名"); 131 head.add("做者"); 132 head.add("出版社"); 133 head.add("購進時間"); 134 head.add("是否借閱"); 135 head.add("是否預定"); 136 137 //數據部分 138 database=new Database(); 139 Vector<Vector> data=database.query("select * from book"); 140 141 //表格部分 142 defaultTableModel=new DefaultTableModel(data,head); 143 table=new JTable(defaultTableModel); 144 scrollPane=new JScrollPane(table); 145 146 } 147 148 public void initSplitPane(){ 149 splitPane=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); 150 splitPane.setTopComponent(panelUp); 151 splitPane.setBottomComponent(scrollPane); 152 splitPane.setDividerSize(4); 153 splitPane.setDividerLocation(100); 154 } 155 156 public void actionPerformed(ActionEvent e) { 157 if(radioButton1.isSelected()){ 158 //設置複雜查詢的三個文本框爲false 159 textField1.setEditable(false); 160 textField2.setEditable(false); 161 textField3.setEditable(false); 162 //設置簡單查詢的文本框爲true 163 textField4.setEditable(true); 164 textField4.requestFocus(); 165 //若是點提交,則檢索 166 if(e.getSource()==button){ 167 String str=textField4.getText().toString().trim(); 168 169 if(str.equals("")){ 170 JOptionPane.showMessageDialog(this, "請輸入必要的信息!!!","消息",JOptionPane.INFORMATION_MESSAGE); 171 return; 172 } 173 if(comboBox.getSelectedIndex()==0){//根據書名進行查詢 174 sql="select * from book where BookName='"+str+"'"; 175 textField4.setText(""); 176 }else if(comboBox.getSelectedIndex()==1){//根據出版社進行查詢 177 sql="select * from book where Publishment='"+str+"'"; 178 textField4.setText(""); 179 }else if(comboBox.getSelectedIndex()==2){//根據做者進行查詢 180 sql="select * from book where Author='"+str+"'"; 181 textField4.setText(""); 182 }else if(comboBox.getSelectedIndex()==3){//根據購進時間進行查詢 183 sql="select * from book where ButTime='"+str+"'"; 184 textField4.setText(""); 185 } 186 //System.out.println(sql); 187 updateTable(sql); 188 189 } 190 }else if(radioButton2.isSelected()){ 191 System.out.println("你選擇了高級查詢"); 192 } 193 } 194 195 public void updateTable(String sql){ 196 //數據部分 197 database=new Database(); 198 Vector<Vector> data=database.query(sql); 199 //System.out.println(data.elementAt(0).elementAt(0).toString()); 200 //表格部分 201 DefaultTableModel defaultTableModel2=(DefaultTableModel) table.getModel(); 202 defaultTableModel2.setDataVector(data, head); 203 table=new JTable(defaultTableModel); 204 table.updateUI(); 205 } 206 }
注意點:佈局
學生管理系統測試
1、界面this
一、 取名(文件名)url
二、 把界面相關的函數放進構造函數裏面,初始化這個類便可啓動界面
三、 用Junit測試不出窗口,在main裏面new一個對象就有窗口
四、 只有樹目錄結構沒有邊界線的時候特別醜
五、 樹的用法,建好類型爲DefaultMutableTreeNode的根節點,就能夠用這個根節點來構造樹了,根下的其它節點(類型爲DefaultMutableTreeNode)直接add進根就好,因此這個樹能夠一直延伸。
六、 用一個JSpiteSpan來分割這個界面,會好看一點
七、 我使用JScollPane給JTree顯示不出來東西,後面在添加了JSpiteSpan以後又好了
八、 右邊是一個JPanel,cardLayout是給JPanel設置的
九、 添加JLabel在有CardLayout加持的JPanel上的時候,必定要給Label上的文字設置水平和垂直居中。label.setHorizontalAlignment(JLabel.CENTER); label.setVerticalAlignment(JLabel.CENTER);
十、在CardLayout裏面show東西的時候,cardLayout.show(panel, "loseBook");這裏前一個參數是CardLayout的父親。
11 退出界面的話,一句話就成了:System.exit(0);不過能夠加個確認框:JOptionPane.showConfirmDialog。
12 作樹的事件監聽的時候就繼承TreeSelectionListener便可,添加事件監聽的時候就能夠直接添加這個。
13
SearchBook界面
2、界面
1 界面繼承JPanel,由於要放進JFrame中
2 數據庫的數據傳到這邊表格顯示
3 還有表頭的設置
4 JSplitPane的設置垂直分割以後JSplitPane.VERTICAL_SPLIT,能夠splitPane.setTopComponent(panelUp);splitPane.setBottomComponent(scrollPane);
5 JTable加了JScrollPane再放進JPanel中,再把這個JPanel放到其餘的JPanel中,顯示不了,JScrollPane直接放在JPanel中便可。
6 DefaultTableModel,這個東西真的是賊好用,defaultTableModel=new DefaultTableModel(null,head);前面的數據部分是一個Vector<Vector> ,後面的head部分是一個Vector<String>
7 JradioButton須要設置一個ButtonGroup給它框起來
8 那些複雜的界面,你把東西一個個加進去,也就很是簡單了
9 下拉列表框JComboBox的使用,comboBox=new JComboBox(str);comboBox.setBounds(120, 20, 150, 20);
10 出現了很難受詭異的東西,把SplitPanel放進JPanel裏面的時候。this.setLayout(new GridLayout(1,1));//設置查詢圖書界面爲網格佈局
是由於他把JPanel設置成了一個網格佈局1*1,而我沒有設置,因此放進去的東西能佔所有,不然,不能佔所有
這樣的圖,超級難受
11 JTabel的updateUI和repaint方法
12 用Vector<Vector>來放回數據時真的超級棒,Vector<Vector> data=database.query("select * from book");
13 事件監聽要注意,兩種方式均可以,radioButton1.isSelected()和e.getSource()==radioButton1,推薦選擇第二種,由於事件的種類你很差肯定 ,這裏選擇前一種,由於開始的時候就有被選了,這兩個要根據狀況選擇。
14 JTable的更新須要好好注意一下