当前位置: 首页 > 知识库问答 >
问题:

如何在JTable中编辑行

方苗宣
2023-03-14

我在stackoverflow上看到过类似的问题,但无论如何,我无法用这些答案解决我的问题。

我想做的是:

  • 单击JTable中的double on单元格(由于IsCelledTable方法,该单元格可以编辑)
  • 在自定义表中保存单元格的新值以打印此新值
  • 更新我的数据库(SQlite)中的数据
  • 这是我的自定义表模型

.

import javax.swing.table.AbstractTableModel;

public class KierunkiTableModel extends AbstractTableModel {
    private boolean DEBUG = false;

    private String[] columnNames = { "Id", "Data Wstawienia",
            "Data Modyfikacji", "Kierunek", "Opis" };
    private Object[][] data = DodEdKierunki.populateData(DodEdKierunki.count);

    @Override
    public int getRowCount() {
        return data.length;

    }

    @Override
    public int getColumnCount() {

        return columnNames.length;
    }

    @Override
    public boolean isCellEditable(int row, int col) {

        return true;

    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {

        return data[rowIndex][columnIndex];
    }

    @Override
    public String getColumnName(int columnIndex) {
        return columnNames[columnIndex];
    }

    public void setValueAt(Object value, int row, int col) {

        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

}
  • 这是我打印JTable的JPanel:
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JTable;

    import baza.danych.DBConnector;

    public class DodEdKierunki extends JPanel implements ActionListener {
        private JButton dodaj;
        private JButton edytuj;
        private JButton next;
        private JButton previous;
        static JTable table;
        static Object[][] data = new Object[1][5];
        static int count = setValue();
    public DodEdKierunki() {
        dodaj = new JButton("Dodaj");
        edytuj = new JButton("Edytuj");

        next = new JButton("Pokaż kolejne 5");
        previous = new JButton("Pokaż poprzednie 5");

        setLayout(new FlowLayout());

        dodaj.addActionListener(this);
        edytuj.addActionListener(this);
        next.addActionListener(this);
        previous.addActionListener(this);

        add(dodaj);
        add(edytuj);
        add(next);
        add(previous);
        table = new JTable(new KierunkiTableModel());
        table.setFillsViewportHeight(true);
        table.getColumnModel().getColumn(0).setPreferredWidth(30);
        table.getColumnModel().getColumn(1).setPreferredWidth(100);
        table.getColumnModel().getColumn(2).setPreferredWidth(100);
        table.getColumnModel().getColumn(3).setPreferredWidth(130);
        table.getColumnModel().getColumn(4).setPreferredWidth(130);
        table.setEnabled(true);

        add(table.getTableHeader(), BorderLayout.PAGE_START);
        add(table, BorderLayout.CENTER);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        Object source = e.getSource();

        if (source == dodaj) {

            new DodajKierunekFrame();
        } else if (source == edytuj) {
            new EdytujKierunekJFrame();

        } else if (source == next) {
            DBConnector db = new DBConnector();
            int id = db.getHighestID("Kierunki");
            int currId = count + 5;
            if (currId <= id) {
                count = count + 5;
                data = populateData(count);
                KierunkiTableModel model = new KierunkiTableModel();
                model.fireTableDataChanged();
                table.setModel(model);
                setLayout(new FlowLayout());
                table.getColumnModel().getColumn(0).setPreferredWidth(30);
                table.getColumnModel().getColumn(1).setPreferredWidth(130);
                table.getColumnModel().getColumn(2).setPreferredWidth(130);
                table.getColumnModel().getColumn(3).setPreferredWidth(100);
                table.getColumnModel().getColumn(4).setPreferredWidth(130);
                table.repaint();
                db.closeConnection();
            }

        } else if (source == previous) {
            if (count > 5) {
                count = count - 5;
                data = populateData(count);

                KierunkiTableModel model = new KierunkiTableModel();

                model.fireTableDataChanged();
                table.setModel(model);
                setLayout(new FlowLayout());
                table.getColumnModel().getColumn(0).setPreferredWidth(30);
                table.getColumnModel().getColumn(1).setPreferredWidth(130);
                table.getColumnModel().getColumn(2).setPreferredWidth(130);
                table.getColumnModel().getColumn(3).setPreferredWidth(100);
                table.getColumnModel().getColumn(4).setPreferredWidth(130);
                table.repaint();

            }
        }

    }

    static Object[][] populateData(int count) {
        DBConnector db = new DBConnector();
        Object[][] lista = db.selectKierunki(count, "Kierunki");
        db.closeConnection();
        return lista;

    }

    private static int setValue() {
        DBConnector db = new DBConnector();
        int value = db.getHighestID("Kierunki");
        db.closeConnection();
        return value;

    }

}

共有1个答案

曹君墨
2023-03-14
Try this
Use DefaultTableModel if you are not

if(ae.getSource()==update){
            int row=table.getSelectedRow();

            int n=JOptionPane.showConfirmDialog(mainPanel, "Would you like to update the record?", "Confirm", JOptionPane.YES_NO_OPTION);

    if (n == JOptionPane.YES_OPTION) {

        try{   


            Connection con=null;
            Statement st=null;
            ResultSet rs=null;
            ResultSet rs1=null;
                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                    String url=null,userID=null,password=null;
                    String dbFileName=null;
                    String sql=null;

                    dbFileName = "C:/db.accdb";

                    url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};"+
                            "DBQ="+dbFileName+";";
                    //sql = "SELECT * FROM tblUserProfile";
                    con=DriverManager.getConnection(url);//,"system","manager"
                    //con=DriverManager.getConnection("jdbc:odbc:shop");
                    st=con.createStatement();
                    rs=st.executeQuery("select * from Credit where TID="+table4.getValueAt(row, 3));
                    if(rs.next()){
                        s1=rs.getString(1);
                        s2=rs.getString(2);//accounno
                        s3=rs.getString(3);//name
                        s4=rs.getString(4);
                        s5=rs.getString(5);//paid
                        s6=rs.getString(6);//unpaid
                    }
                PreparedStatement smt=con.prepareStatement("select * from Debit where Name=?");
                smt.setObject(1, s3);
                rs=smt.executeQuery();
                if(rs.next()){
                    u1=rs.getString(1);
                    u2=rs.getString(2);
                    u3=rs.getString(3);
                    u4=rs.getString(4);
                    u5=rs.getString(5);
                    u6=rs.getString(6);//unpaid

                }

                st.executeUpdate("delete from Credit where TID="+table4.getValueAt(row,3));

                st.executeUpdate("delete from Debit where Name='"+s3+"'");
                tid=Integer.parseInt(table4.getValueAt(row, 3).toString());
                date=table.getValueAt(row, 0).toString();
                jama=table.getValueAt(row, 1).toString();//s5
                baki=table.getValueAt(row, 2).toString();//s6
                nett=table4.getValueAt(row, 4).toString();
                 rs1=st.executeQuery("select * from NettDate where Name='"+s3+"'");
                 while(rs1.next()){
                     nettdate=rs1.getString(2);
                     nettbal=rs1.getString(3);
                 }
                String tpaid=Integer.toString(Integer.parseInt(s5)-Integer.parseInt(jama));
                String tunpaid=Integer.toString(Integer.parseInt(s6)-Integer.parseInt(baki));

                if(u6.contains("-")){
                    System.out.println("Contains -");
                if(tpaid.contains("-")&tunpaid.contains("-")){
                  tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                 nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                  System.out.println("1-"+tupdate);
              }else if(!tpaid.contains("-")&tunpaid.contains("-")){
                tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                 nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("2-"+tupdate);}
              else if(tpaid.contains("-")&!tunpaid.contains("-")){
                    tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
               nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("3-"+tupdate);
                }else{
                    tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
               nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("4-"+tupdate);
                }
                }else{
                    System.out.println("Not Contains -");
                if(tpaid.contains("-")&tunpaid.contains("-")){
                  tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                 nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                  System.out.println("1"+tupdate);
              }else if(!tpaid.contains("-")&tunpaid.contains("-")){
                tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                 nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("2"+tupdate);}
              else if(tpaid.contains("-")&!tunpaid.contains("-")){
                    tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
               nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("3"+tupdate);
                }else{
                    tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
               nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("4"+tupdate);
                }    
                }
 //               tupdate=Integer.toString(Integer.parseInt(a)+Integer.parseInt(paid)-Integer.parseInt(unpaid));
   //             }else{
     //           tupdate=Integer.toString(Integer.parseInt(a)-Integer.parseInt(paid)+Integer.parseInt(unpaid));

       //         }
                int i=st.executeUpdate("insert into Credit values("+tid+",'"+s2+"','"+s3+"','"+date+"','"+jama+"','"+baki+"','"+nett+"')");
                st.executeUpdate("insert into Debit values('"+s2+"','"+s3+"','"+u3+"','"+u4+"','"+date+"','"+tupdate+"')");
                //if(Integer.parseInt(table.getValueAt(row, 4).toString())==1){
                if(Integer.parseInt(table4.getValueAt(row, 4).toString())==1){
                   st.executeUpdate("delete from NettDate where Name='"+s3+"'");

                    st.executeUpdate("insert into NettDate values('"+s3+"','"+date+"','"+nettb+"')");
                }
                if(i==0){
                    String msg="Record not updated Successfully";
                    String ss="Sorry..........";
                    int res=JOptionPane.PLAIN_MESSAGE;
                    JOptionPane.showMessageDialog((Component) null,msg,ss,res);
                }else{
                    String msg="Record updated Successfully";
                    String ss="Congratlations..........";
                    int res=JOptionPane.PLAIN_MESSAGE;
                    JOptionPane.showMessageDialog((Component) null,msg,ss,res);
                    //dispose();
                }
                jComboBox.requestFocusInWindow();

            model.setRowCount(0);
                                model1.setRowCount(0);
                                model2.setRowCount(0);
                                b=0;
                                a=0;
                                tj="0";
                                tb="0";
                                t=0;
                                gt="0";
                                an="0";nam="0";mono="0";cit="0";

                                DBEngine dbengine = new DBEngine();
        data = dbengine.getJamaCustomer(s3);
        Object[] d3={data1.get(0).get(0),data1.get(0).get(1),data1.get(0).get(3),data1.get(0).get(4)};
        model1.addRow(d3);

        JTable table5=new JTable(data,header3);
        for(int i2=0;i2<table5.getRowCount();i2++){
        Object[] d={data.get(i2).get(0),data.get(i2).get(1),data.get(i2).get(2),data.get(i2).get(3),data.get(i2).get(4)};
        model2.addRow(d);
        }

        JTable table1=new JTable(data,header);
        for(int i1=0;i1<table1.getRowCount();i1++){
        Object[] d={data.get(i1).get(0),data.get(i1).get(1),data.get(i1).get(2)};//,data.get(i).get(3),data.get(i).get(4)};
        model.addRow(d);

        }
        for(int i2=0;i2<table1.getRowCount();i2++){
            a=a+Integer.parseInt(data.get(i2).get(1));

            b=b+Integer.parseInt(data.get(i2).get(2));
        }
        tj=Integer.toString(a);
        tb=Integer.toString(b);
        Object[] d1={"Total",tj,tb};//,"",""};
        Object[] d11={"Total",tj,tb,"",""};
        model.addRow(d1);
        model2.addRow(d11);



        t=Integer.parseInt(tb)-Integer.parseInt(tj);
        gt=Integer.toString(t);
        Object[] d2={"Nett Balance","",gt};//,"",""};
        Object[] d21={"Nett Balance","",gt,"",""};
        model.addRow(d2);
        model2.addRow(d21);
        jlab7.setText(gt);
        tablePanel.repaint();
                con.close();

         } catch (ClassNotFoundException ex) {
                    Logger.getLogger(ManageCustomer.class.getName()).log(Level.SEVERE, null, ex);
                }catch(Exception err){ 
                    System.out.println("GG Yes"+err);
                }
    } else if (n == JOptionPane.NO_OPTION) {
        try {
            Connection con=null;
            Statement st=null;
            ResultSet rs=null;
                       // ResultSet rs1=null;

            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String url=null,userID=null,password=null;
                    String dbFileName=null;
                    String sql=null;

                    dbFileName = "C:/Program Files/Shop/shop.accdb";
                                //userID = "Admin";
                                password = "3064101991";
                    url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};"+
                            "DBQ="+dbFileName+";"+
                            "Pwd="+password+";";
                    //sql = "SELECT * FROM tblUserProfile";
                    con=DriverManager.getConnection(url);//,"system","manager"
                    st = con.createStatement();
                      //rs=st.executeQuery("select * from Credit where TID="+table.getValueAt(row, 0));
                      rs=st.executeQuery("select * from Credit where TID="+table4.getValueAt(row, 3));
                    if(rs.next()){
                        s1=rs.getString(1);
                        s2=rs.getString(2);//accounno
                        s3=rs.getString(3);//name
                        s4=rs.getString(4);
                        s5=rs.getString(5);//paid
                        s6=rs.getString(6);//unpaid
                    }

            model.setRowCount(0);
                                model1.setRowCount(0);
                                model2.setRowCount(0);
                                b=0;
                                a=0;
                                tj="0";
                                tb="0";
                                t=0;
                                gt="0";
                                an="0";nam="0";mono="0";cit="0";

                                DBEngine dbengine = new DBEngine();
        data = dbengine.getJamaCustomer(s3);
        Object[] d3={data1.get(0).get(0),data1.get(0).get(1),data1.get(0).get(3),data1.get(0).get(4)};
        model1.addRow(d3);
        JTable table5=new JTable(data,header3);
        for(int i2=0;i2<table5.getRowCount();i2++){
        Object[] d={data.get(i2).get(0),data.get(i2).get(1),data.get(i2).get(2),data.get(i2).get(3),data.get(i2).get(4)};
        model2.addRow(d);
        }

        JTable table1=new JTable(data,header);
        for(int i1=0;i1<table1.getRowCount();i1++){
        Object[] d={data.get(i1).get(0),data.get(i1).get(1),data.get(i1).get(2)};//,data.get(i).get(3),data.get(i).get(4)};
        model.addRow(d);

        }
        for(int i2=0;i2<table1.getRowCount();i2++){
            a=a+Integer.parseInt(data.get(i2).get(1));

            b=b+Integer.parseInt(data.get(i2).get(2));
        }
        tj=Integer.toString(a);
        tb=Integer.toString(b);
        Object[] d1={"Total",tj,tb};//,"",""};
        Object[] d11={"Total",tj,tb,"",""};
        model.addRow(d1);
        model2.addRow(d11);



        t=Integer.parseInt(tb)-Integer.parseInt(tj);
        gt=Integer.toString(t);
        Object[] d2={"Nett Balance","",gt};//,"",""};
        Object[] d21={"Nett Balance","",gt,"",""};
        model.addRow(d2);
        model2.addRow(d21);
        jlab7.setText(gt);
        tablePanel.repaint();
        jComboBox.requestFocusInWindow();

//            rs=st.executeQuery("select TID,Date,Paid,Unpaid,Nett from Credit where Name='"+s3+"' order by Date");
  //          table.setModel(buildTableModel(rs));
            con.close();
            //pstmt.close();
              JOptionPane.showMessageDialog((Component) null,"You choose not to update the data !");

        }catch (ClassNotFoundException err) {
            // System.out.println(e);
            err.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex);
        }
    }
}//end btn1


public Vector getJamaCustomer(Object name)throws Exception
{
Vector<Vector<String>> jamacustomerVector = new Vector<Vector<String>>();

Connection conn = dbConnection();
PreparedStatement pre = conn.prepareStatement("select * from Credit where Name='"+name+"' order by TID");
ResultSet rs = pre.executeQuery();//

while(rs.next())
{
Vector<String> jamacustomer = new Vector<String>();
//jamacustomer.add(rs.getString(2)); //Empid
jamacustomer.add(rs.getString(4)); //Empid
jamacustomer.add(rs.getString(5)); //Empid
jamacustomer.add(rs.getString(6)); //Empid
jamacustomer.add(rs.getString(1)); //Empid
jamacustomer.add(rs.getString(7)); //Empid
jamacustomerVector.add(jamacustomer);

}
/*Close the connection after use (MUST)*/
if(conn!=null)
conn.close();

return jamacustomerVector;
//return bakicustomerVector;
}
 类似资料:
  • 问题内容: 创建JTable组件时,默认情况下启用单元格编辑。如何防止用户编辑JTable的内容? 问题答案: JTable使用AbstractTableModel对象。这就是您传递给JTable的构造函数的东西。您可以如下编写自己的AbstractTableModel 然后将您的JTable初始化为

  • 问题内容: 我试图以编程方式开始在按键上编辑当前行的第三列。 我实现了一个KeyListener,其中包含以下代码 当我释放Enter时,单元格确实是可编辑的(我可以在末尾键入),但是没有插入符号。 当我用鼠标单击时,行为是预期的(我可以进行编辑,并且存在carret)。 另外,我注意到在释放键时,我的celleditor为null,而在mouseclick上,它也不为null。 我究竟做错了什么

  • 问题内容: 我有一个JTable,显示来自SQL数据库的行。该表相对较小(仅4列,最多1000行)。 我想让用户有机会编辑表中的任何单元格,但要避免过多地限制它,以便他们必须使用编辑对话框(这使错误检查和验证更加容易,但不太直观) 我尝试了几种使用JTable的valueChanged方法控制编辑选择的方法,但是运气不佳。 我希望在编辑结束时对每一行进行编辑并将其写入数据库。我希望一旦单击一个单元

  • 问题内容: 有什么办法可以在jtable中动态制作不可编辑的单元格吗?每当用户提供类似false的输入时,我都想创建不可编辑的单元格…我已经在DefaultTableModel isCellEditable方法中看到过,但是如果我想使用它,则每次创建新对象时都会创建它,因此我想动态更改它为不可编辑。有人可以帮我吗?。谢谢 问题答案: 其他班级 然后,您可以通过使用存储的myModel变量并在其上调

  • 设计定制JTable我已经知道DefaultCellEditor在其构造函数中允许使用JComboBox。单击此JComboBox以显示列表项时,它显示在JTable的其他单元格上方。问题是,我需要一个更复杂的行为,就像JComboBox提供的那样,这样我就用一个JList和一个JButton实现了一个JTextField,当点击JButton(或者用户在JTextField中输入文本)时,JLi

  • 问题内容: 我想让可编辑JTables中的编辑器在开始编辑时选择单元格中的所有文本。我已经尝试了几件事,都是围绕从TableCellEditor.getTableCellEditorComponent方法返回的组件上调用JTextComponent.selectAll()进行的。我尝试过的所有方法均无济于事。 在最近的尝试中,我从Swing教程更改了SimpleTableDemo类,以使用自定义T