主类:
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.为何我点添加一个之后(可以在添加界面中点取消),返回主界面,在点击某行进行删除,会出现请选定一行呢?明明已经选定?而在开始时候选中并点击是能正确的?
上面不够写了下面继续

解决方案 »

  1.   


    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);//返回列默认名称
    }}
    大家帮我看看吧,想了很久 没能解决。郁闷啊!
      

  2.   

    刷新可以用JTable的updateUI()的
    if(rowIndex == -1){
       //提示
       JOptionPane.showMessageDialog(this, "请选择要删除的那行");
      return;
    }你这里不是判断了吗,没有选中表中的记录就会弹这个出来的啦!还是说你有其他原因呢?
      

  3.   

    我写过一个sql查询的东西,当时没注意刷新,我直接找下面写了,它自动刷新了。            rsmd = res.getMetaData();//rsmd 是ResultSetMediaData类的对象
             
             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);
      

  4.   


    不是这个意思,调用JTable的updateUI方法也不行啊。
    是点击添加按钮之后,在“选中”(已经选中)之后再点删除,也会出现"请选择要删除的那行");
      

  5.   


    这个方法我是有的,在我的表格模型里面。不知道你注意了没。。
    看看1#的那个类和每一个操作之后,都会有的代码:
                  sm = new Stu_Model();
                jt = new JTable(sm);
    也就相当于你的那几句了。。
      

  6.   

    lz把建表文件给我,我懒的建表,[email protected]
    关于刷新,实在不行,
    先remove(table);
    跟着new JTable();
    再add(table);
    最后repaint();
    如果放到JScrollPanel里了,就remove(scrollpanel),然后依次类推
    我如果碰上不能刷新的话,就这样做,lz看着办