2013-05-22 4 views
0

Я сделал JTable для списка химических веществ в инвентаре, где можно сортировать каждый столбцы, используя следующий код (chemicalTable это имя JTable):NullPointerException в Java TableRowSorter

chemicalTable.setAutoCreateRowSorter(true); 
TableRowSorter<TableModel> sorter1 
     = new TableRowSorter<TableModel>(chemicalTable.getModel()); 
chemicalTable.setRowSorter(sorter1); 

Тогда я использовал jTextfield, чтобы создать поисковый запрос с помощью KeyTyped Listener, чтобы всякий раз, когда пользователь вводит определенный символ, таблица обновляется. И это обычно работает.

Я использовал этот код в keyTypedListener для SearchBox:

DefaultTableModel dm = (DefaultTableModel) chemicalTable.getModel(); 

str = searchChemicalText.getText(); 

     try { 
      String url = "jdbc:mysql://localhost/chemical inventory"; 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      conn = DriverManager.getConnection(url, "root", ""); 


     } catch (Exception e) { 
      JOptionPane.showMessageDialog(this, "Error Occurred.", "Error", JOptionPane.ERROR_MESSAGE); 
     } 

     int ctr = 0; 


     while (ctr < chemicalTable.getRowCount()) { 
      chemicalTable.getModel().setValueAt(null, ctr, 0); 
      chemicalTable.getModel().setValueAt(null, ctr, 1); 
      chemicalTable.getModel().setValueAt(null, ctr, 2); 
      ctr++; 

     } 

     int count = 0; 

     try { 
      Statement stmt = conn.createStatement(); 
      String query = "Select * FROM chemicallist where name_of_reagent like '%" + str + "%'"; 
      ResultSet rs = stmt.executeQuery(query); 

      if (rs.next()) { 
       rs = stmt.executeQuery(query); 

       while (rs.next()) { 
        String qty = null, qtyunit = null, chemstate = null, reagentName = null; 

        reagentName = rs.getString("name_of_reagent"); 
        qty = rs.getString("quantity"); 
        qtyunit = rs.getString("quantity_unit"); 
        chemstate = rs.getString("state"); 
        chemicalTable.getModel().setValueAt(reagentName, count, 0); 
        chemicalTable.getModel().setValueAt(qty + " " + qtyunit, count, 1); 
        chemicalTable.getModel().setValueAt(chemstate, count, 2); 



        if (count + 1 > chemicalTable.getRowCount() - 1) { 
         dm.setRowCount(chemicalTable.getRowCount() + 1); 
         dm.fireTableRowsInserted(0, 5); 


        } 
        count++; 


       } 
      } 
     } catch (Exception e) { 
      JOptionPane.showMessageDialog(this, "Error Occurred.", "Error", JOptionPane.ERROR_MESSAGE); 


     } 

Моя проблема заключается в: Всякий раз, когда я всервые любые столбцы (col1, col2, или col3) и вставить символ в строку поиска, я получил сообщение об ошибке:

«Исключение произошло во время события диспетчерского java.lang.NullPointerException»

+3

Лучшее название, описывающее резюме вашей проблемы, привлечет больше помощи :) – Bill

+2

Это должно было быть одним из наименее информативных титулов. Затем покажите фактическую строку, которая бросает NPE (NullPointerException). –

+0

Если этот код находится в KeyListener, вы выглядите в беде. Во-первых, я бы не рекомендовал использовать KeyListener с JTextField. Затем вы делаете много длительной обработки в потоке событий Swing, и это приводит к возникновению ошибки потоковой передачи. Если ваш NPE встречается периодически и неожиданно, возможно, это связано с проблемой потоковой передачи. –

ответ

2

Хотя это не представляется возможным для отладки фрагментов коды, несколько вещей выделяются:

  • В этом же разделе вы ссылаться на TableModel в dm и chemicalTable.getModel(); используйте одну ссылку или убедитесь, что они ссылаются на один и тот же экземпляр.

  • Вместо того, чтобы вмешиваться в игру setRowCount(), используйте один из методов addRow().

  • Методы DefaultTableModel, которые изменяют модель, запускают правильное событие для вас, и таблица автоматически обновит ее соответствующим образом; вам не придется делать это самостоятельно.

+1

или можно протестировать на 'table.setAutoCreateRowSorter (true);' – mKorbel

Смежные вопросы