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

Posted

技术标签:

【中文标题】在 jTable 中选择一行会产生错误【英文标题】:Selecting a row in jTable generates error 【发布时间】:2016-03-16 02:01:04 【问题描述】:

我在这里尝试做的是,当我在表中选择一行时,加载数据后,它应该在文本字段 (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());

【问题讨论】:

你应该在你的问题中提供堆栈跟踪,而不是链接到谷歌文档。我无法从此处访问 google 文档,以后可能无法使用它来帮助其他人找到答案。 【参考方案1】:

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

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

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

=> getValueAt 导致您的异常。

尝试以下方法:

String rowSelected = "";
if(row != -1)

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

编辑 正如你所说的你只是想得到选择的值,你的代码的位置是错误的。

您正试图在加载数据时获取所选行的值。但那时你没有选择一行。 我认为您需要类似的东西(在表格上单击鼠标即可打印出值):

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");
    
   

【讨论】:

我在 CustomerIdTF 中输入“1”,这是我表中的第一条记录...不仅仅是加载数据...抱歉,如果您的意思是别的,请为我澄清一下跨度> ......正如我之前所说,即使在加载数据之前,只要我点击我的按钮,就会发生错误,因此询问行是无关紧要的。 只是想要求堆栈跟踪或类似的东西,以便我可以帮助您找到错误...使用堆栈跟踪,您可以确定发生错误的确切行,所以它会是轻松找到解决问题的方法 我在帖子中提供了一个链接。 你已经尝试过我的建议了吗?错误发生在“getValueAt”函数中。请替换您的“ String rowSelected=(tbl.getModel().getValueAt(row, 0).toString());”用我的解决方案告诉我它是否有效。【参考方案2】:

您的情况是,当您调用tbl.getSelectedRow() 时,它返回了-1。这是一个标记值,表示没有选择任何行。当鼠标单击某行或键盘将选择移至该行时,该行被选中。当没有选择行时,您将需要处理这种情况。我不知道你的要求和目标,所以我不能建议如何做到这一点。如果您想在选择更改时收到通知并对其做出反应,您可以向 JTable 注册选择侦听器。 (见getSelectionModeladdListSelectionListenerListSelectionListener

如果您没有在 JTable 上启用排序或过滤,您可能无需处理它,但是值得知道 视图 (JTable) 中的行索引不是model (DefaultTableModel) 中的相同索引。使用convertRowIndexToModel 方法将视图的索引(由getSelectedRow() 报告)转换为模型的索引(由getValueAt() 要求)。

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

【讨论】:

以上是关于在 jTable 中选择一行会产生错误的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的JTable如何在显示的时候默认选择到第一行

请教关于Jtable与Jcombobox结合使用的一个问题

从JTable获取对象

JTable 未更新

(Java) JTable行的用户选择

JTable 中的错误不起作用