从JTable填充JTextFields时出错

时间:2015-04-13 21:30:26

标签: java swing jtable jtextfield indexoutofboundsexception

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

我正在开发搜索功能和详细的数据视图。 这些组件是JPanel,其中包含JToggleButton(触发搜索)a JTextField(插入要搜索的文字)和JTableJScrollPane中的最后一个}})。

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

这是错误:

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 个答案:

答案 0 :(得分:4)

问题在于您的选择侦听器,您不验证是否实际选择了任何内容。如果未选择任何内容,您将获得索引-1

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

重写它:

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