java - 从 JTable 填充 JTextField 时出错

标签 java swing jtable jtextfield indexoutofboundsexception

我正在 Java Swing 项目中使用 Netbeans。

我正在开发搜索功能和详细的数据 View 。 这些组件是一个 JPanel,其中包含一个 JToggleButton(触发搜索)、一个 JTextField(插入要搜索的文本)和一个 JTable (最后一个在 JScrollPane 中)。

在此面板下方有另一个面板,其中包含一些文本字段,当选择表中的一行时,这些文本字段会更新。 搜索工作正常,文本字段也更新,但仅限于第一次搜索,当我在表中选择一行时,搜索按钮停止工作并且表行为异常。

这是错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.Vector.elementData(Vector.java:734)
    at java.util.Vector.elementAt(Vector.java:477)
    at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:648)

....

希望有人能指出我的错误所在。

这是代码的一部分:

private void runQueryBasedOnName() {
executeHQLQuery(query1 + jTextField2.getText() + "%'");
}

private void executeHQLQuery(String hql) {
try {    
     SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
     Session session = sessionFactory.openSession();  
     session.beginTransaction();
     Query q = session.createQuery(hql);
     List resultList = (List) q.list();
     displayResult(resultList);
     session.getTransaction().commit();              
   } catch (HibernateException he) {
   he.printStackTrace();
   }
}

private void jToggleButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                               

    DefaultTableModel model1 = (DefaultTableModel) jTable1.getModel();
    model1.setRowCount(0);
    jTable1.repaint();
    if(!jTextField2.getText().trim().equals("")) {  

    jTextField5.setText("");
    jTextField6.setText("");
    jTextField8.setText("");
    jTextField7.setText("");
    jTextField9.setText("");

    runQueryBasedOnName();        
}
}

private void displayResult(List resultList) {

  Vector<String> tableHeaders = new Vector<String>();
  final Vector tableData = new Vector();   
  tableHeaders.add("Id");
  tableHeaders.add("Site name"); 
  tableHeaders.add("SITE_LINK");
  tableHeaders.add("SITE_DESC");
  tableHeaders.add("Start data");

        for(Object o : resultList) {
    Sites sites;
    sites = (Sites)o;
    Vector<Object> oneRow = new Vector<Object>();
    oneRow.add(sites.getSiteId());
    oneRow.add(sites.getSiteName());
    oneRow.add(sites.getSiteLink());
    oneRow.add(sites.getSiteDesc());
    oneRow.add(sites.getSiteDataIn());
    tableData.add(oneRow);
        }    

         jTable1.setModel(new DefaultTableModel(tableData, tableHeaders));

    TableColumn clm= jTable1.getColumn("SITE_LINK");
        clm.setMaxWidth(0);
        clm.setMinWidth(0);
        clm.setPreferredWidth(0);

    TableColumn clm1= jTable1.getColumn("SITE_DESC");
        clm1.setMaxWidth(0);
        clm1.setMinWidth(0);
        clm1.setPreferredWidth(0);    

  jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener(){

public void valueChanged(ListSelectionEvent e){

    if(e.getValueIsAdjusting()) return;
    {
        ListSelectionModel model = jTable1.getSelectionModel();  
        int lead = model.getLeadSelectionIndex(); 
        displayRowValues(lead);  
        System.out.println("sono in value change, lead = " + lead);
    } 
}

private void displayRowValues(int rowIndex){

   String txtfield5 = "";
   String txtfield6 = "";
   String txtfield8 = "";
   String txtfield7 = "";
   String txtfield9 = "";
   Object otxtfield5 = jTable1.getValueAt(rowIndex, 0);
   Object otxtfield6 = jTable1.getValueAt(rowIndex, 1);
   Object otxtfield8 = jTable1.getValueAt(rowIndex, 2);
   Object otxtfield7 = jTable1.getValueAt(rowIndex, 3);
   Object otxtfield9 = jTable1.getValueAt(rowIndex, 4);        
   txtfield5 += otxtfield5.toString();
   txtfield6 += otxtfield6.toString();
   txtfield8 += otxtfield8.toString();
   txtfield7 += otxtfield7.toString();
   txtfield9 += otxtfield9.toString();
   jTextField5.setText(txtfield5);
   jTextField6.setText(txtfield6);
   jTextField8.setText(txtfield8);
   jTextField7.setText(txtfield7);
   jTextField9.setText(txtfield9);

}

});

}

最佳答案

问题出在您的选择监听器中,您没有验证是否实际选择了任何内容。如果未选择任何内容,您将获得索引 -1:

    int lead = model.getLeadSelectionIndex(); 
    displayRowValues(lead);  // lead could be -1 --> Hence the exception

重写如下:

    int lead = model.getLeadSelectionIndex();
    if(lead>-1)   
        displayRowValues(lead);  

关于java - 从 JTable 填充 JTextField 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29615453/

相关文章:

java - 在小程序查看器中调用时出现空白屏幕

java - 代码是否应该由 EDT(事件调度线程)执行之间的混淆?

java - 将 JComboBox 嵌入 JRadioButtonMenuItem 中

java JTable - 单击单元格时选择整行

java - JTable中如何将整行数据加粗?

java - 制作 Sprite 的 2D 网格

java - 是否有可能在 Android 蓝牙和笔记本电脑蓝牙设备之间建立不安全的连接?

Java 8 流。除其他元素外的所有元素

java - onClick 事件监听器不适用于 Activity

java - 在 NetBeans 中从 AbstractTableModel 创建 JTable