【问题标题】:Problem with delete correct row from database using JTable and column button使用 JTable 和列按钮从数据库中删除正确行的问题
【发布时间】:2020-01-16 17:49:24
【问题描述】:

我正在用 JTable 和一个 MySQL 数据库编写代码,并将一个表从数据库加载到 JTable 中。我也做了按钮列,这个按钮删除它所在的行。按下后行消失,但在数据库中删除了错误的行。

当我尝试删除最后一行时,我得到了这个异常:

线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 8 >= 8.

这里是 ActionListener 方法:

jButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            int row = table.convertRowIndexToModel(table.getEditingRow());
            model.removeRow(row);
            System.out.print(row);
            deleteOrder.removeFromDB(table.getModel().getValueAt(row, 0).toString());//table.getValueAt(row, column).toString());//?????????
            fireEditingStopped();
        }       
}); 

这是其他类的方法,这里我将值加载到JTable

private static void loadOrdersTable() throws SQLException {
    String[][]data = new String[takeOrder.countOrder()][5];
    String[] columnNames = {"Order ID", "Table ID","Name","Price","Delete Button"};
    data = takeOrder.getOrder();
    DefaultTableModel model = new DefaultTableModel(data, columnNames);
    table = new JTable( model );
    table.getColumnModel().getColumn(4).setCellRenderer(new ButtonTableRenderer());
    table.getColumnModel().getColumn(4).setCellEditor(new ButtonTableEditor(new JTextField(),table, model));    
}

这是我从 DB(TakeOrder 类)中选择值的方法:

public String[][] getOrder() throws SQLException {
    int i = 0;
    String data[][] = new String[countOrder()][5];
    String query = "SELECT order_id, table_id, dish_name, dish_price FROM orders";

    try {
        statement = makeConnection.getConnection().createStatement();
        resultSet = statement.executeQuery(query);
        while(resultSet.next()) {
             String orderId = resultSet.getString(1);
             String restTableId = resultSet.getString(2);
             String name = resultSet.getString(3);
             int price = resultSet.getInt(4);
             data[i][0] = orderId;
             data[i][1] = restTableId;
             data[i][2] = name;
             data[i][3] = String.valueOf(price);
             data[i][4] = "Delete";
             i++;
        }
        System.out.print("Ilość: " + i);
    } catch(Exception e) {
        System.out.print("getOrder(String tableId) error " + e.getMessage());
    }

    return data;
}

你知道问题出在哪里吗?

【问题讨论】:

  • 问题可能出在 StackTrace 所说的位置...

标签: java mysql swing jtable


【解决方案1】:

当我尝试删除最后一行时,我得到了这个异常:

int row = table.convertRowIndexToModel(table.getEditingRow());
model.removeRow(row);
System.out.print(row);
deleteOrder.removeFromDB(table.getModel().getValueAt(row, 0).toString());

是的,您已经从 TableModel 中删除了最后一行。

因此您不能使用 getValueAt(...) 方法再次访问该行。

您需要重新排序逻辑。比如:

String valueFromTable = model.getValueAt(row, 0).toString();
model.removeRow(row);
deleteOrder.removeFromDB( valueFromTable );

【讨论】:

    猜你喜欢
    • 2015-02-11
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2014-09-28
    相关资源
    最近更新 更多