1. 程式人生 > >通過JTable顯示對學生表的增刪改查

通過JTable顯示對學生表的增刪改查

  首先我們建立好專案,由於我使用的是mysql資料庫,就要匯入連線mysql的jar包:mysql-connector-java-5.1.3-rc-bin.jar。

  接下來,我們就要對專案分好層

  這次我們主要講ui層的編寫,其它層的程式碼就不一 一展示了,有需要的可以在此處下載 https://pan.baidu.com/s/1uYPkjUOI_NLL6ktkAdq5EQ

  主介面的步驟都在以下的程式碼中,在程式碼中對每一步操作都已註釋了

 

import java.awt.BorderLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.TreeSet; import java.util.Vector; import
javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import pojo.Student; import pojo.StudentConstant; import service.StudentService; import service.impl.StudentServiceImpl; import util.DataConversion; public class JTableTest extends JFrame{ private JPanel jp1=new JPanel(); private JPanel jp2=new JPanel(); private JPanel jp3=new JPanel(); private JTable jt =null; private JButton select =new JButton("查詢"); private JButton delete =new JButton("刪除"); private JButton update =new JButton("確認修改"); private JButton add =new JButton("增加"); private JButton recover =new JButton("恢復"); private JTextField jtf=new JTextField(20); private JScrollPane jsp=null; private DefaultTableModel dtm=null; private StudentService ss=new StudentServiceImpl(); private List<Student> list=null; private Vector<Vector<String>> vec1; private Vector<String> vec2=null; private String st=null; //===========儲存修改後的列名===================== private Set<Integer> li=null; public JTableTest() { this.setTitle("學生表"); this.setSize(500, 600); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); //============設定一個儲存表頭的Vector========== vec2=new Vector<String>(); vec2.add("學號"); vec2.add("編號"); vec2.add("姓名"); vec2.add("分數");
list
=ss.selectStudentAll();
    // vec1
=DataConversion.zhuanHuan(list);
    //============為表模型設定資料和表頭============= dtm
=new DefaultTableModel(vec1,vec2); jt=new JTable(){
      //===============設定資料是否可編輯================
public boolean isCellEditable(int row, int column) {
      //==============姓名、分數可編輯==================
if(column==StudentConstant.SNAME||column==StudentConstant.SCORE) return true; else return false; } }; jt.setModel(dtm);
     //===========設定表的點選方式為只可單選=============== jt.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    //================設定列不可移動============= jt.getTableHeader().setReorderingAllowed(
false);
    //===============設定所以列不可調整大小=================== jt.getTableHeader().setResizingAllowed(
false); //===============隱藏學號這一列因為學號不可被客戶檢視,但我們對資料的增刪改查需要用到主鍵,所以隱藏=================== TableColumn tc=jt.getColumnModel().getColumn(0); tc.setMaxWidth(0); tc.setMinWidth(0); tc.setPreferredWidth(0); tc.setResizable(false); li=new TreeSet<Integer>(); //===========查詢========================== select.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { String sname=jtf.getText(); list=new ArrayList<Student>(); list=ss.selectStudentBySname(sname); flush(); } }); //===============增加===================== add.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) {
    //=============new一個新的增加視窗============= AddJFrame ad
=new AddJFrame();
    //=============當主窗體獲得焦點時重新整理一下Jtable============ add.addFocusListener(
new FocusAdapter() { public void focusGained(FocusEvent e) { list=ss.selectStudentAll(); flush(); } }); } }); //================刪除===================== delete.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { int i=jt.getSelectedRow(); //=======判斷是否選中不選中不彈視窗============== if(i!=-1) { String s=(String) dtm.getValueAt(i, StudentConstant.SID);
          //=================彈確認刪除視窗==================================
int t=JOptionPane.showConfirmDialog(JTableTest.this, "是否刪除該資料"); switch (t) { case JOptionPane.YES_OPTION: ss.deleteStudent(Integer.parseInt(s)); list=ss.selectStudentAll(); flush(); } } } }); //=================修改資料==================== //==================獲取修改前的資料=============== jt.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { int i=jt.getSelectedRow(); int j=jt.getSelectedColumn(); st = (String) jt.getValueAt(i, j); } });
     dtm.addTableModelListener(
new TableModelListener() { public void tableChanged(TableModelEvent e) { int i=jt.getSelectedRow(); int j=jt.getSelectedColumn(); String s= (String) jt.getValueAt(i, j);
       //=================判斷修改後資料有沒有發生改變===============
if(e.getType()==TableModelEvent.UPDATE) { if(st!=null&!st.equals(s)) {
       //================改變後就加入set集合裡,注意此處使用set集合重複修改的也只會提交一次可以提高效能===================== li.add(i); } } } });
//================確認修改============ update.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { int t=JOptionPane.showConfirmDialog(JTableTest.this, "你確認修改嗎,修改後不可恢復"); switch (t) {
      //========================確認修改,在資料庫中修改============================
case JOptionPane.YES_OPTION: for (Integer i : li) { Student s=new Student(); String ssid=(String) jt.getValueAt(i, StudentConstant.SID); int sid=Integer.parseInt(ssid); String sname=(String) jt.getValueAt(i, StudentConstant.SNAME); int score=Integer.parseInt((String) jt.getValueAt(i, StudentConstant.SCORE)); s.setSid(sid); s.setSname(sname); s.setScore(score); ss.upadteStudent(s); } list=ss.selectStudentAll(); flush(); } } }); //===================恢復==================== recover.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { int t=JOptionPane.showConfirmDialog(JTableTest.this, "你確認恢復嗎,只可以恢復到上一次確認修改後的位置"); switch (t) { case JOptionPane.YES_OPTION:
    //==============確認修改之前只是在表上修改了資料沒有對資料庫進行操作,點選恢復只需要重新查詢資料庫重新整理介面======================== list
=ss.selectStudentAll(); flush(); } } }); jsp=new JScrollPane(jt); jp1.add(jtf); jp1.add(select); jp2.add(jsp); jp3.add(add); jp3.add(delete); jp3.add(recover); jp3.add(update); this.getContentPane().add(jp1, BorderLayout.NORTH); this.getContentPane().add(jp2); this.getContentPane().add(jp3, BorderLayout.SOUTH); this.setVisible(true); } private void flush() {
  //==============改變模型的資料==================== vec1
=DataConversion.zhuanHuan(list); dtm=new DefaultTableModel(vec1,vec2); jt.setModel(dtm);
  //======每次重新整理的時候隱藏第一列================= TableColumn tc
=jt.getColumnModel().getColumn(0); tc.setMaxWidth(0); tc.setMinWidth(0); tc.setPreferredWidth(0); tc.setResizable(false); } public static void main(String[] args) throws SQLException { new JTableTest(); } }

  以下為增加功能的彈窗

package ui;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import pojo.Student;
import service.StudentService;
import service.impl.StudentServiceImpl;

public class AddJFrame extends JFrame{
    private JLabel sname=new JLabel("姓名");
    private JTextField jtf1=new JTextField();
    private JLabel score=new JLabel("分數");
    private JTextField jtf2=new JTextField();
    private JButton jb=new JButton("儲存");
    private StudentService ss=new StudentServiceImpl();
    
    public AddJFrame() {
        this.setTitle("新增");
        this.setSize(400, 300);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setResizable(false);
        this.setLayout(null);
        sname.setBounds(120, 100, 55, 20);
        this.add(sname);
        jtf1.setBounds(180, 100, 90, 20);
        this.add(jtf1);
        score.setBounds(120, 145, 55, 20);
        this.add(score);
        jtf2.setBounds(180, 145, 90, 20);
        this.add(jtf2);
        jb.setBounds(160, 195, 90, 20);
        
        jb.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                Student s=new Student();
                //==========非空判斷===========
                String name=jtf1.getText();
                String scc=jtf2.getText();
                if(name.length()!=0&&scc.length()!=-1)
                {
                    int sc =Integer.parseInt(scc);
                    s.setSname(name);
                    s.setScore(sc);
                    ss.addStudent(s);
                    AddJFrame.this.dispose();
                }
            }
        });
        
        
        
        
        
        this.add(jb);
        this.setVisible(true);
    }
}

總結:在對學生表的刪除功能中,我在一開始寫的時候並沒有判斷有沒有選中,這一點要注意,因為不判斷的話,在String s=(String) dtm.getValueAt(i, StudentConstant.SID);這一行程式碼中就會報陣列越界異常,因為沒有選中的時候i為-1.

還有就是在增加視窗的非空判斷,如果沒有判斷輸入空時就會報數字轉換異常,由於在寫的時候比較疏忽也就沒有對成績進行進行判斷,希望大家諒解。

看完後記得留條評論啊!