在jTable中选择一行会产生错误

时间:2015-12-10 12:23:02

标签: java mysql swing jdbc

我在这里尝试的是,当我在表格中选择一行时,在加载数据后,它应该在文本字段中显示所选行的值(selectedRowTF)。但是一旦我点击jButton,就会产生以下错误 -

java.lang.ArrayIndexOutOfBoundsException:-1

由于甚至在加载数据之前就会发生错误,所以我甚至没有机会选择一行。

您是否也认为我使用正确的代码来获取行的值?

Stack Trace

DefaultTableModel model;
model=(DefaultTableModel)tbl.getModel();
try {
    Class.forName("java.sql.Driver");
    Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/divign","root","password");
    Statement stmt=con.createStatement();

    int row=tbl.getSelectedRow();
    String rowSelected=(tbl.getModel().getValueAt(row, 0).toString());

    String query="SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = '"+customerIdTF.getText()+"' ;";

    ResultSet rs=stmt.executeQuery(query);
    if(rs.next()) {
        model.addRow (new Object[ ] {
            rs.getInt(1),rs.getString(2),rs.getString(3)
            });
        selectedRowTF.setText(""+rowSelected);  
    }
    rs.close();
    stmt.close();
    con.close();
}
catch(Exception e){
    JOptionPane.showMessageDialog(null,e.toString());
}

2 个答案:

答案 0 :(得分:0)

如果您只是加载数据,tbl.getSelectedRow()会返回-1

之后,您尝试获取无效行的第一列的字符串值。

String rowSelected=(tbl.getModel().getValueAt(row, 0).toString());

=> getValueAt导致您的例外。

尝试以下方法:

String rowSelected = "";
if(row != -1)
{
    rowSelected = tbl.getModel().getValueAt(row, 0).toString();
}

EDIT 正如您所说,您只想获取所选值,代码的位置是错误的。

您正在尝试在加载数据时获取所选行的值。但那时候你不会选择一行。 我认为你需要这样的东西(在桌面点击鼠标时打印出值):

tbl.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        int row = table.getSelectedRow();
        if (row > -1) {
            String value = (table.getModel().getValueAt(row, 0).toString());
            System.out.println("Value of row " + row + " col 0: '" + value + "'");
            selectedRowTF.setText(value);
        } else {
            System.out.println("Invalid selection");
        }
    }
});

或者您可以点击按钮对选择做出反应:

private void btClickActionPerformed(java.awt.event.ActionEvent evt) {                                        
    int row = table.getSelectedRow();
    if (row > -1) {
        String value = (table.getModel().getValueAt(row, 0).toString());
        System.out.println("Value of row " + row + " col 0: '" + value + "'");
        selectedRowTF.setText(value);
    } else {
        System.out.println("Invalid selection");
    }
}   

答案 1 :(得分:0)

您的情况是,当您致电tbl.getSelectedRow()时,它返回-1。这是一个标记值,表示没有选择行。当鼠标单击它时,或者当键盘将选择移动到该行时,将选择一行。当没有选择行时,您将需要处理这种情况。我不知道你的要求和目标,所以我无法就如何做到这一点提出建议。如果希望在选择更改并对其作出反应时收到通知,则可以使用JTable注册选择侦听器。 (请参阅getSelectionModeladdListSelectionListenerListSelectionListener

如果你没有在JTable上启用排序或过滤,你可能会在没有处理它的情况下离开,但值得知道视图JTable)中的行索引是模型DefaultTableModel)中的索引不同。使用convertRowIndexToModel方法将视图的索引(由getSelectedRow()报告)转换为模型的索引(getValueAt()所需)。

您发布的代码还包含SQL注入问题。我建议您研究该主题,并使用PreparedStatementsetString()进行修复。