我用表格显示出了数据库中某表的信息
窗口中只包含一张表和两个按钮,一个‘添加’,一个‘删除’
实现了‘添加’按钮可添加一空行,和‘删除’按钮 删除指定行。
我现在如何在添加的空行中直接添加数据并保存在数据库中呢?如何修改指定表格中的数据呢?不知道事件该如何处理似的。。
(代码如下,哪位大侠能否详细指点指点,不胜感谢!)
public class ZhangHuSheZhiJFrame extends javax.swing.JFrame {
    public ZhangHuSheZhiJFrame() {
        initComponents();
        setLocationRelativeTo(null); //增加这一句,使窗口居中
    }
    
.....private void jButtonDelActionPerformed(java.awt.event.ActionEvent evt) {
    //获取表格当前模型
    DefaultTableModel myModel=((DefaultTableModel)jTableZhangHu.getModel());    
    int rowNum=myModel.getRowCount();//获取表格行数
    int nowColNum=jTableZhangHu.getSelectedColumn();
    int nowRowNum=jTableZhangHu.getSelectedRow();
    System.out.println("行="+nowRowNum+"  "+"列="+nowColNum);
    if(rowNum>0){
        if(jTableZhangHu.getSelectedRow()!=-1){
            
            //先从数据库删除数据
             String ss=(String)jTableZhangHu.getValueAt(nowRowNum, 0);
            String del_sql="delete zhangHu where ZhangHuName='"+ss.trim()+"'";
            Connection con=DBConnection.getConnection();
            ResultSet rs = null;
            try
            {
                PreparedStatement pstmt=con.prepareStatement(del_sql);
                pstmt.executeUpdate(); 
            }
            catch(Exception e)
            {
                    JOptionPane.showMessageDialog(null, "删除行失败!", "提示", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            }           
            //然后从表格删除数据
        myModel.removeRow(nowRowNum);//删除指定行
        }else{
             JOptionPane.showMessageDialog(null, "请选定要删除行! ", "提示", JOptionPane.ERROR_MESSAGE);
        }                                                                                                                                            
    }
}private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt) {
    DefaultTableModel myModel=((DefaultTableModel)jTableZhangHu.getModel());
    Vector newRow=new Vector();//创建一个用来存储新添加行内容的Vector
    int columnNum=myModel.getColumnCount();//获取表格的列数
    for(int i=0;i<columnNum;i++){
        newRow.add("");//将新行内容设置为空
    }
    myModel.getDataVector().add(newRow);
    ((DefaultTableModel)jTableZhangHu.getModel()).fireTableStructureChanged();
}    public DefaultTableModel initialTableModel(){ 
             Vector title=new Vector();
             title.add("账户名称");
             title.add("账号");
             title.add("余额");
             title.add("开户人");
             title.add("说明");
             Vector content=new Vector();
             int column=0;
                 try
 {
Connection con=DBConnection.getConnection();
                Statement stat=con.createStatement();
        ResultSet rs=stat.executeQuery("select * from zhangHu");
                        
                        while(rs.next()){
                             Vector rowsContent=new Vector();
                             rowsContent.add(rs.getString(1));
                             rowsContent.add(rs.getString(2));
                             rowsContent.add(rs.getFloat(3));
                             rowsContent.add(rs.getString(4));
                             rowsContent.add(rs.getString(5));
                             content.add(rowsContent);
                        }
                        con.close(); //关闭连接
                            rs.close();    //关闭查询
                 }catch(Exception e){
                     e.printStackTrace();
                 }         DefaultTableModel myDefaultTableModel=new DefaultTableModel(content,title);
         return myDefaultTableModel;
    }
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ZhangHuSheZhiJFrame().setVisible(true);
            }
        });
    }    private javax.swing.JButton jButtonAdd;
    private javax.swing.JButton jButtonDel;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTableZhangHu;
}

解决方案 »

  1.   

    如何获取每个添加的数据,并放进Vector呢?
      

  2.   

    给你个思路.如果某一行的数据是从数据库中读取出来的.那么它会多一个字段显示(界面多一列有值).如果是新添加的话,界面上的这一列就会没有值.比如说数据库里的主键.还没有添加的数据是没有主键的.可以按这个思路去做.每一行一行的读,判断一个那个列(主要列)里有没有值.没有值就再取其它的列的值出来,并存到数据库中去.个人建议写一个封装类.就是封装一条数据库的类public class 帐户类名
    {
    private String 帐户名称;
    private String 帐号;
    ...
    ....对应的get/set方法.}得到所有的行
    for()
    {
    得到一行
    if(主键列没有值)
    {   创建一个"帐户类名"对像
       取下一列的值放到这个对像中
      ....
      ....
     把对像放到vector里去(现在可以用ArrayList);  
    }
    }返回这个vector保存的方法(Vector  v)
    {
    遍历这个V.
    取得里边的"帐户类名"对像.使用JDBC把对像里边的属性值保存到数据库中}
    没怎么做SWING说得不好别介意
      

  3.   

    这是一个非常复杂的问题,我研究了很长一段时间了,由于公司内部代码保密性,我只能给你思路和一部分代码,自己去实现,做这个东东要考虑很多问题的.
    1,我们应该让整个表格不能编辑,如果需要编辑了,点一个按钮命令,调用
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub
    if(toolBarStatus)   //这里的toolBarStatus既控制了是否表格处于编辑状态
    return colWritable == null ? false : (columnIndex == 0 ? true : (isAdd?true:colWritable[columnIndex - 1]));
    else 
    return false;
    }
    2,既然表格处于了编辑状态,那么就要锁定这一行,如果用户不小心选择了其它行就要弹出相应的提示:
    addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
    if (e.getButton() == 1) {    //鼠标单击左键
    if(lockedRow==-1 || lockedRow==getSelectedRow()){
    for (int i = 0; i < value.size(); i++) {
    value.get(i).setSelected(false);
    }
    }else{
             final int i=new CpoysyDialog("数据未保存,您确认保存吗?\n点击\"是\"保存,点击\"否\"不保存,点击\"取消\"回到所编辑的行.").openConfirmOkNoCancel();
    if(i==0){
    _toolBarSaveAction();   //执行保存的命令
    }else if(i==1){
    _toolBarCancelAction();//执行不保存的命令
    }else{
                    setRowSelectionInterval(lockedRow, lockedRow);//执行取消的命令,既选中到原来被锁定的行                return;        }
    }

    }
    }@Override
    public void mouseReleased(MouseEvent e) {
    if (e.getButton() == 1) {
    int myRow[] = getSelectedRows();
    for (int i = 0; i < myRow.length; i++) {
    setValueAt(true, myRow[i], 0);
    }
    _getNumAt();
    }
    }
    });
      

  4.   

    package newpackage;
    import javax.swing.table.DefaultTableModel;
    import java.util.Vector; 
    import ucpplib.*;
    import ucpplib.NetTable;
    /**
     *
     * @author  Administrator
     */
    public class NewJFrame extends javax.swing.JFrame {
        
        /** Creates new form NewJFrame */
        public NewJFrame() 
        {
            initComponents();
        } 
        public DefaultTableModel initialTableModel()
        {
            Vector title = new Vector();
    //        title.add("编号");
    //        title.add("姓名");
    //        title.add("性别");
    //        title.add("学校");
              title.add("id");
              title.add("name");
              title.add("shape");
            CString dbname = new CString("mail");
            CString tblname = new CString("table");
            NetManager netm ;
             __intp bret = new __intp();
            netm = new NetManager(20);
            newpackage.OsOperate my = new newpackage.OsOperate(netm);//创建一个mgrbaseif对象
            my.SetServer("127.0.0.1",9068);//指定服务器的端口
            NetTable rowids = new NetTable();
            my.TableGetRowidEx(dbname, tblname, 0, 3, bret, rowids);
            NetTable data = new NetTable();
            CString cols = new  CString();
            Vector content = new Vector();
            
            if(my.TableGet(dbname, tblname, rowids, cols, bret, data))
             {
                for(int i = 1,j = 0; i <= data.RowCount(); i++,j=0)
                { 
                  Vector data1 = new Vector();
                  while(j++ < data.ColCount())
                  {
                     
                     data1.add(data.GetData(i, j));
                    
                  }
                   content.add(data1);
                }
              }
           // Vector content = new Vector();
            DefaultTableModel myDefaultTableModel= new DefaultTableModel(content,title);
            return myDefaultTableModel;
            
        }
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {        jScrollPane1 = new javax.swing.JScrollPane();
            jTable1 = new javax.swing.JTable();        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);        jTable1.setModel(this.initialTableModel());
            jScrollPane1.setViewportView(jTable1);        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(15, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap(15, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap())
            );        pack();
        }// </editor-fold>
        
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() 
            {
                public void run() {
                    new NewJFrame().setVisible(true);
                }
            });
        }
        
        // Variables declaration - do not modify
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTable jTable1;
        // End of variables declaration
        
    }