我正在使用 JTable 和 MySQL 数据库编写代码,并将数据库中的表加载到 JTable 中。我还制作了按钮列,该按钮删除它所在的行。按下后该行消失,但在数据库中删除了错误的行。
此外,当我尝试删除最后一行时,我收到此异常:
Exception in thread "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));
}
这是我从数据库(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;
}
你知道问题出在哪里吗?
最佳答案
when I try to remove last row I get this exception:
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 );
关于java - 使用 JTable 和列按钮从数据库中删除正确的行时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947560/