主类:
import javax.swing.*;import java.awt.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;
import java.awt.event.*;
public class test7 extends JFrame implements ActionListener{ JPanel jp1 , jp2;
JLabel jl1;
JButton jb1 , jb2 ,jb3 ,jb4;
JTable jt;
JScrollPane jsp;
JTextField jtf1;
Stu_Model sm = null;
JMenuBar a;
JMenu a1;
JMenu a2;
JMenuItem a11;
JMenuItem a12;
JMenuItem a13;
JMenuItem a14;
JMenuItem a15;
JMenuItem a16;
ImageIcon a11_icon;
ImageIcon zuoye_icon;
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
/*SplashScreen splashScreen = SplashScreen.getSplashScreen();
if(splashScreen!=null){
try {
test6 test = new test6();
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Thread.sleep(3000);
test.setVisible(true);
} catch (InterruptedException e) {}
}*/
test7 test = new test7();
}
public test7(){
jp1 = new JPanel();
jtf1 = new JTextField(10);
jb1 = new JButton("查询");
jb1.addActionListener(this);//把监听器加入到里面
//jb2.addActionListener(this);//把监听器加入到里面
jl1 = new JLabel("请输入名字");
//把各个空间加入到jp1
jp1.add(jl1);
jp1.add(jtf1);
jp1.add(jb1);
a11_icon = new ImageIcon("image//1.jpg");
zuoye_icon = new ImageIcon("image//zuozhe.jpg");
a = new JMenuBar();// 菜单条
a1 = new JMenu("操作(G)");// 菜单1
a2 = new JMenu("帮助(H)");// 菜单1
a11 = new JMenuItem("添加(A)",a11_icon);// 菜单1的菜单项
a11.addActionListener(this);
a1.add(a11);
a12 = new JMenuItem("修改(U)",a11_icon);// 菜单1的菜单项
a12.addActionListener(this);
a1.add(a12);
a13 = new JMenuItem("删除(D)",a11_icon);// 菜单1的菜单项
a13.addActionListener(this);
a1.add(a13);
a14 = new JMenuItem("退出(Q)",a11_icon);// 菜单1的菜单项
a14.addActionListener(this);
a1.add(a14);
a1.insertSeparator(3);
a15 = new JMenuItem("关于此系统" , zuoye_icon);// 菜单1的菜单项
a2.add(a15);
a16 = new JMenuItem("关于作者" , zuoye_icon);// 菜单1的菜单项
a2.add(a16);
a.add(a1);
a.add(a2);
this.setJMenuBar(a);
this.setTitle("学生管理系统");
jp2 = new JPanel();
jb2 = new JButton("添加");
jb2.addActionListener(this);//把监听器加入到里面
jb3 = new JButton("修改");
jb3.addActionListener(this);//把监听器加入到里面
jb4 = new JButton("删除");
jb4.addActionListener(this);//把监听器加入到里面
//各个空间加入到jp2
jp2.add(jb2);
jp2.add(jb3);
jp2.add(jb4);
//初始化JTable
//jt = new JTable(rowData , columnNames);//rowData columnNames被封装到Stu_Model类里面去了
//封装之后只需要创建一个数据模型对象
sm = new Stu_Model();
jt = new JTable(sm);
//初始化jsp JScrollPane
jsp = new JScrollPane(jt);
//把jsp放入到JFrame
this.add(jsp);
this.add(jp1 , BorderLayout.NORTH);
this.add(jp2 , BorderLayout.SOUTH);
this.setSize(400, 300);
this.setLocation(450, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// TODO 自动生成方法存根
if(e.getSource() == jb1){//查询按钮的事件
//System.out.println("已经点击了按钮!");
String name = this.jtf1.getText().trim();
String sql = "select * from student where stu_name = '" + name + "'";
//System.out.println(sql);
Stu_Model sm = new Stu_Model(sql);
jt.setModel(sm);
}
else if(e.getSource() == jb2 || e.getSource() == a11){//添加按钮的事件
Stu_addDiag testadd= new Stu_addDiag(this , "添加窗口" , true);
sm = new Stu_Model();
jt = new JTable(sm);
}
else if(e.getSource() == jb4 || e.getSource() == a13){//删除按钮的事件
//int rowIndex = this.jt.getSelectedColumn();用错语句
int rowIndex = this.jt.getSelectedRow();
if(rowIndex == -1){
//提示
JOptionPane.showMessageDialog(this, "请选择要删除的那行");
return;
}
//得到学生编号
String stu_no = (String)sm.getValueAt(rowIndex, 0);
//System.out.println(stu_no);
String sql = "delete from student where stu_no = '" + stu_no + "'";
//用一个语句封装删除语句
PreparedStatement ps = null;
Connection ct = null;
ResultSet rs = null;
//中间部分
try{
//Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:3569;databaseName=students" , "sa" , "123");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
ct = DriverManager.getConnection("jdbc:odbc:stu","","");
ps = ct.prepareStatement(sql);
ps.executeUpdate();
System.out.println("xxxxx");
}catch(Exception ee){
ee.printStackTrace();
}finally{
try{
if(rs != null) rs.close();
if(ps != null) ps.close();
if(ct != null) ct.close();
}catch(Exception ee){
ee.printStackTrace();
}
}
sm = new Stu_Model();
jt.setModel(sm);
}
else if(e.getSource() == a14){
System.exit(0);
} }
}
Stu_addDiag:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;import javax.swing.*;public class Stu_addDiag extends JDialog implements ActionListener{
JLabel jl1 , jl2 , jl3 , jl4 , jl5 , jl6;
JButton jb1 , jb2;
JTextField jtf1 , jtf2 ,jtf3 ,jtf4 ,jtf5 ,jtf6;
JPanel jp1 , jp2 , jp3;
public Stu_addDiag(Frame owner,String title,boolean modal ){
/*
* owner - 显示该对话框的 Frame
title - 该对话框的标题栏中所显示的 String
modal - 指定对话框在显示时是否阻塞用户向其他顶层窗口输入。如果为 true,
则模式类型属性被设置为 DEFAULT_MODALITY_TYPE;否则对话框是无模式的。
* */
super(owner , title , modal);
jl1 = new JLabel("学号");
jl2 = new JLabel("姓名");
jl3 = new JLabel("年龄");
jl4 = new JLabel("专业");
jl5 = new JLabel("性别");
jl6 = new JLabel("籍贯");
jtf1 = new JTextField();
jtf2 = new JTextField();
jtf3 = new JTextField();
jtf4 = new JTextField();
jtf5 = new JTextField();
jtf6 = new JTextField();
jb1 = new JButton("确定");
jb1.addActionListener(this);
jb2 = new JButton("取消");
jb2.addActionListener(this);
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
//设置布局
jp1.setLayout(new GridLayout(6 , 1));
jp2.setLayout(new GridLayout(6 , 1));
//添加组件
jp1.add(jl1);
jp1.add(jl2);
jp1.add(jl3);
jp1.add(jl4);
jp1.add(jl5);
jp1.add(jl6);
jp2.add(jtf1);
jp2.add(jtf2);
jp2.add(jtf3);
jp2.add(jtf4);
jp2.add(jtf5);
jp2.add(jtf6);
jp3.add(jb1);
jp3.add(jb2);
this.add(jp1 , BorderLayout.WEST);
this.add(jp2 , BorderLayout.CENTER);
this.add(jp3 , BorderLayout.SOUTH);
this.setSize(300 , 200);
this.setLocation(510, 245);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// TODO 自动生成方法存根
if(e.getSource() == jb1){
Vector rowData , columnNames;
//定义操作数据库需要的东西
PreparedStatement ps = null;
Connection ct = null;
ResultSet rs = null;
try{
//Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:3569;databaseName=students" , "sa" , "123");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
ct = DriverManager.getConnection("jdbc:odbc:stu","","");
String sql = "insert into student values(?,?,?,?,?,?)";
ps = ct.prepareStatement(sql);
//给参数赋值
ps.setString(1, jtf1.getText().trim());
ps.setString(2, jtf2.getText().trim());
ps.setInt(3, Integer.parseInt(jtf3.getText().trim()));
ps.setString(4, jtf4.getText().trim());
ps.setString(5, jtf5.getText().trim());
ps.setString(6, jtf6.getText().trim());
//执行更新操作,对象中执行 SQL 语句
ps.executeUpdate();
//关闭对话框
this.dispose();
}catch(Exception ee){
ee.printStackTrace();
}finally{
try{
if(rs != null) rs.close();
if(ps != null) ps.close();
if(ct != null) ct.close();
}catch(Exception ee){
ee.printStackTrace();
}
}
}
else if(e.getSource() == jb2){
this.dispose();
}
}
}
这里面有两个问题:1.添加之后不能立即在主界面中刷新。
2.为何我点添加一个之后(可以在添加界面中点取消),返回主界面,在点击某行进行删除,会出现请选定一行呢?明明已经选定?而在开始时候选中并点击是能正确的?
上面不够写了下面继续
Stu_Model:import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;import javax.swing.table.AbstractTableModel;public class Stu_Model extends AbstractTableModel{
Vector rowData , columnNames;
PreparedStatement ps = null;
Connection ct = null;
ResultSet rs = null;
//用一个方法封装查询语句
public void select(String sql){
//中间部分
columnNames = new Vector();
//设置列名
columnNames.add("学号");
columnNames.add("姓名");
columnNames.add("年龄");
columnNames.add("专业");
columnNames.add("性别");
columnNames.add("籍贯");
rowData = new Vector();
try{
//Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:3569;databaseName=students" , "sa" , "123");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
ct = DriverManager.getConnection("jdbc:odbc:stu","","");
ps = ct.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
Vector hang = new Vector();
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add(rs.getInt(3));
hang.add(rs.getString(4));
hang.add(rs.getString(5));
hang.add(rs.getString(6));
rowData.add(hang);
}
}catch(Exception ee){
ee.printStackTrace();
}finally{
try{
if(rs != null) rs.close();
if(ps != null) ps.close();
if(ct != null) ct.close();
}catch(Exception ee){
ee.printStackTrace();
}
}
}
//做一个构造函数,用于初始化我们的数据模型
public Stu_Model(){
select("select * from student");
}
//另外一个构造函数
public Stu_Model(String sql){
select(sql);
}
public int getColumnCount() {
// TODO 自动生成方法存根
//System.out.println("我是自动调用的!");
return this.columnNames.size();//返回模型列表的列数
//return 0;
} public int getRowCount() {
// TODO 自动生成方法存根
return this.rowData.size();//返回模型列表的行数
//return 0;
} //得到某行某列的数据rowIndex代表行columnIndex代表列
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO 自动生成方法存根
return ((Vector)this.rowData.get(rowIndex)).get(columnIndex);
//return null;
} @Override
public String getColumnName(int column) {
// TODO 自动生成方法存根
//return super.getColumnName(column);
return (String) this.columnNames.get(column);//返回列默认名称
}}
大家帮我看看吧,想了很久 没能解决。郁闷啊!
if(rowIndex == -1){
//提示
JOptionPane.showMessageDialog(this, "请选择要删除的那行");
return;
}你这里不是判断了吗,没有选中表中的记录就会弹这个出来的啦!还是说你有其他原因呢?
int coulumn = rsmd.getColumnCount();
while(res.next())
{
Vector v = new Vector();
for (int i = 1; i <= coulumn; i++)
{
v.add(res.getString(i));
}
vColumnData.add(v);
}//vColumnData和vHeader是存放数据的向量和标向量
for (int i = 1; i <= coulumn; i++)
{
vHeader.add(rsmd.getColumnName(i));
}
tableModel = new DefaultTableModel(vColumnData,vHeader);
table.setModel(tableModel);
不是这个意思,调用JTable的updateUI方法也不行啊。
是点击添加按钮之后,在“选中”(已经选中)之后再点删除,也会出现"请选择要删除的那行");
这个方法我是有的,在我的表格模型里面。不知道你注意了没。。
看看1#的那个类和每一个操作之后,都会有的代码:
sm = new Stu_Model();
jt = new JTable(sm);
也就相当于你的那几句了。。
关于刷新,实在不行,
先remove(table);
跟着new JTable();
再add(table);
最后repaint();
如果放到JScrollPanel里了,就remove(scrollpanel),然后依次类推
我如果碰上不能刷新的话,就这样做,lz看着办