通過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.

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

看完后記得留條評論啊!

 


免責聲明!

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



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