importjava.awt.BorderLayout;importjava.awt.event.FocusAdapter;importjava.awt.event.FocusEvent;importjava.awt.event.FocusListener;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;importjava.util.Set;importjava.util.TreeSet;importjava.util.Vector;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTable;importjavax.swing.JTextField;importjavax.swing.ListSelectionModel;importjavax.swing.event.TableModelEvent;importjavax.swing.event.TableModelListener;importjavax.swing.table.DefaultTableModel;importjavax.swing.table.TableColumn;importpojo.Student;importpojo.StudentConstant;importservice.StudentService;importservice.impl.StudentServiceImpl;importutil.DataConversion;public class JTableTest extendsJFrame{private JPanel jp1=newJPanel();private JPanel jp2=newJPanel();private JPanel jp3=newJPanel();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=newStudentServiceImpl();private List list=null;private Vector>vec1;private Vector vec2=null;private String st=null;//===========保存修改后的列名=====================
private Set li=null;publicJTableTest() {this.setTitle("学生表");this.setSize(500, 600);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);
//============设置一个保存表头的Vector==========
vec2=new Vector();
vec2.add("学号");
vec2.add("编号");
vec2.add("姓名");
vec2.add("分数");
list=ss.selectStudentAll();
//
vec1=DataConversion.zhuanHuan(list);
//============为表模型设置数据和表头=============
dtm=newDefaultTableModel(vec1,vec2);
jt=newJTable(){
//===============设置数据是否可编辑================public boolean isCellEditable(int row, intcolumn) {
//==============姓名、分数可编辑==================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();//===========查询==========================
select.addMouseListener(newMouseAdapter() {public voidmouseClicked(MouseEvent e) {
String sname=jtf.getText();
list=new ArrayList();
list=ss.selectStudentBySname(sname);
flush();
}
});//===============增加=====================
add.addMouseListener(newMouseAdapter() {public voidmouseClicked(MouseEvent e) {
//=============new一个新的增加窗口=============
AddJFrame ad=newAddJFrame();
//=============当主窗体获得焦点时刷新一下Jtable============
add.addFocusListener(newFocusAdapter() {public voidfocusGained(FocusEvent e) {
list=ss.selectStudentAll();
flush();
}
});
}
});//================删除=====================
delete.addMouseListener(newMouseAdapter() {public voidmouseClicked(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) {caseJOptionPane.YES_OPTION:
ss.deleteStudent(Integer.parseInt(s));
list=ss.selectStudentAll();
flush();
}
}
}
});//=================修改数据====================//==================获取修改前的数据===============
jt.addMouseListener(newMouseAdapter() {public voidmouseClicked(MouseEvent e) {int i=jt.getSelectedRow();int j=jt.getSelectedColumn();
st=(String) jt.getValueAt(i, j);
}
});
dtm.addTableModelListener(newTableModelListener() {public voidtableChanged(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(newMouseAdapter() {public voidmouseClicked(MouseEvent e) {int t=JOptionPane.showConfirmDialog(JTableTest.this, "你确认修改吗,修改后不可恢复");switch(t) {
//========================确认修改,在数据库中修改============================caseJOptionPane.YES_OPTION:for(Integer i : li) {
Student s=newStudent();
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(newMouseAdapter() {public voidmouseClicked(MouseEvent e) {int t=JOptionPane.showConfirmDialog(JTableTest.this, "你确认恢复吗,只可以恢复到上一次确认修改后的位置");switch(t) {caseJOptionPane.YES_OPTION:
//==============确认修改之前只是在表上修改了数据没有对数据库进行操作,点击恢复只需要重新查询数据库刷新界面========================
list=ss.selectStudentAll();
flush();
}
}
});
jsp=newJScrollPane(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 voidflush() {
//==============改变模型的数据====================
vec1=DataConversion.zhuanHuan(list);
dtm=newDefaultTableModel(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) throwsSQLException {newJTableTest();
}
}
这个示例展示了如何使用Java Swing的JTable组件与MySQL数据库进行交互,实现学生信息的查询、添加、删除和修改功能。通过监听JTable事件,实现了对数据的实时修改,并在用户确认后更新数据库。

被折叠的 条评论
为什么被折叠?



