首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JAVA update database JTable单元更改

JAVA update database JTable单元更改
EN

Stack Overflow用户
提问于 2013-06-21 17:42:54
回答 1查看 21.9K关注 0票数 2

我对Java是个新手(这不是什么新鲜事),我找不到一个好的教程。我使用jTable显示一个用来自MySQL数据库的数据填充的表。

到目前为止一切顺利,我得到了表:

您可以单击表格单元格,它会变成一个文本字段,其中可以填充新的内容。你们都知道,但是我如何使用它来更新我的数据库中的值呢?

我的代码:

代码语言:javascript
复制
import [...];
public class table extends JPanel {
    public String table;
    private Database db;

    public table(String tablename, Database db){

        try {
            table = tablename;
            this.db = db;

            //Get table with and height
            ResultSet res = db.query("SELECT COUNT( * ) FROM `"+table+"`");
            ResultSet res2 = db.query("SELECT COUNT( * ) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '"+table+"'");

            int rows = 0;
            int collums = 0;

            res.next();
            res2.next();

            rows = res.getInt(1);
            collums = res2.getInt(1);

            //Get table column names and set then in array
            ResultSet clom = db.query("DESCRIBE  `"+table+"`");

            String[] columnNames = new String[collums];

            int s = 0;

            while(clom.next()){
                columnNames[s] = clom.getString(1);
                s++;
            }

            //get table data and put in array
            Object[][] data = new Object[rows][collums];

            ResultSet result = db.query("SELECT * FROM `"+table+"`");

            int q = 0;

            while(result.next()){
                for(int a=0; a<= (collums - 1); a++){
                    data[q][a] = result.getString(a + 1);
                    //System.out.println(q + " - " + a);
                }
                q++;
            }

            //Make Jtable of the db result form the two array's
            final JTable table = new JTable(data, columnNames);
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);

            // do some event listening for cell change

            JScrollPane scrollPane = new JScrollPane(table);
            JFrame frame = new JFrame("table editor");
            scrollPane.setOpaque(true);
            frame.setContentPane(scrollPane);
            frame.pack();
            frame.setSize(600, 800);
            frame.setVisible(true);
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }
}

我想我需要绑定某种类型的表侦听器,当发生变化时,我会获取表的所有值,并使用查询来更新它们。

我该怎么做呢?

这是我的伪代码:

代码语言:javascript
复制
table.bindCellEventListner(callback(t){
     Array row = t.getAllValuesAsArrayOfRow();

     String data = "";

     int f = 0
     while(row.next()){
         data .= "`"+clom[f]+"` = '"+row[f]+"',"
         f++;
     }
     data.delLastChar();
     db.query("UPDATE `"+table+"` SET "+data+" WHERE `id` ="+row[0]+";");

});
EN

回答 1

Stack Overflow用户

发布于 2018-06-12 08:55:15

here发现,一个被删除的答案抄袭了瑞秋·斯威尔斯14年前的答案。为了完整性,并且因为答案正确和有用的,我在这里引用了相关文本:

第一步:如果你从现在开始让你的表扩展一个TableModel (如果你还没有这样做的话),整个事情就会变得简单得多。所以,如果你需要帮助的话,尽管开口。

第2步:在表格模型中,您需要使单元格可编辑。在您创建的TableModel类中,需要添加以下方法

代码语言:javascript
复制
public boolean isCellEditable(int row, int col) { 
  return true; 
}

public void setValueAt(Object value, int row, int col) {
  rowData[row][col] = value;
  fireTableCellUpdated(row, col);
}

步骤3:在第二个方法中,您将看到我们触发了一个名为fireTableCellUpdated的方法。所以在这里我们可以捕捉到它的用途改变了什么。您需要向表中添加一个TableModelListener才能捕捉到这种情况。

代码语言:javascript
复制
mytable.getModel().addTableModelListener(yourClass);

,并且在您决定要实现TableModelListener的类中,您需要这样做

代码语言:javascript
复制
public void tableChanged(TableModelEvent e) {
  int row = e.getFirstRow();
  int column = e.getColumn();
  TableModel model = (TableModel)e.getSource();
  Object data = model.getValueAt(row, column);
  ...
}

现在您有了单元格中的数据和网格中

单元格,这样您就可以像使用一样使用数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17232118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档