2013-01-13 37 views
1

這裏更換表的內容是一類與表的過程涉及filtering與搜索

//類DbUtils

public class DbUtils { 
    public static TableModel resultSetToTableModel(ResultSet rs) { 

     try { 
     ResultSetMetaData metaData = rs.getMetaData(); 
     int numberOfColumns = metaData.getColumnCount(); 
     Vector columnNames = new Vector(); 

     for (int column=0; column < numberOfColumns; column++) { 
      columnNames.addElement(metaData.getColumnLabel(column + 1));    
     } 
     Vector rows = new Vector(); 
     while(rs.next()) { 
     Vector newRow = new Vector(); 
     for (int i =1; i <= numberOfColumns; i++) { 
     newRow.addElement(rs.getObject(i)); 
     } 
     rows.addElement(newRow); 
     } 
     return new DefaultTableModel(rows,columnNames); 

     } catch (Exception e) { 
      e.printStackTrace();  
     return null; 
    } 



} 

}

我有在更新了工作表的方法class Job_GUI,傳入的參數是sql statements,其中填充了table_job。傳入的sql語句取決於選擇哪個JTabbedPane,並將index值考慮在內。這是我的問題所在。

//類Job_GUI

public void UpdateJobTable(String sql) { 
    try { 

    pst = conn.prepareStatement(sql); 
    rs = pst.executeQuery(); 

    table_job.setModel(DbUtils.resultSetToTableModel(rs)); 
    table_job.getColumnModel().getColumn(0).setPreferredWidth(50); 
     table_job.getColumnModel().getColumn(1).setPreferredWidth(140); 
     table_job.getColumnModel().getColumn(2).setPreferredWidth(170); 
     table_job.getColumnModel().getColumn(3).setPreferredWidth(80); 
     table_job.getColumnModel().getColumn(4).setPreferredWidth(120); 

} 
    catch (Exception e) { 

     JOptionPane.showMessageDialog(null, e); 
    } 

    finally { 

     try { 

      pst.close(); 
      rs.close(); 
     } catch (Exception e) { 

     } 
    } 
} 



private void JobTabbedPaneStateChanged(javax.swing.event.ChangeEvent evt) {           
    JTabbedPane sourceTabbedPane = (JTabbedPane) evt.getSource(); 
    int index = sourceTabbedPane.getSelectedIndex(); 
    if (index == 0) { 

     jobTableInit(); 

    } 
    else if (index == 1) { 
     fillCombo(); 

    } 

    else if(index==2) { 
     try { 
      sql = "SELECT Job.jobID as 'Job ID', Employer.name as'Company', Job.title as 'Role', Job.description as 'Description', Job.type as 'Type', Job.benefits as 'Benefits', Job.closing as 'Closing Date' FROM Job INNER JOIN Employer ON Job.employerID=Employer.employerID ORDER BY Employer.name"; 
      pst = conn.prepareStatement(sql); 
      rs = pst.executeQuery(); 
      TableModel model = DbUtils.resultSetToTableModel(rs); 
      table_job.setModel(model); 
      final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
      table_job.setRowSorter(sorter); 
      JScrollPane pane = new JScrollPane(table_job); 
      searchJob.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e) { 
       String text = keyword.getText(); 
       if (text.length() == 0) { 
       sorter.setRowFilter(null); 
       } else { 
        sorter.setRowFilter(RowFilter.regexFilter(text)); 


        } 
       }    
      }); 

     } 

     catch (Exception e) { 
      e.printStackTrace();     
     } 


    } 

當我在index 2模式中,table_job內容被抹去,即,要回索引0,表變空,而intially它是充滿數據。當我在索引2中時,我不希望table_job爲空,而是仍然繼續顯示數據,除非在JTextField中輸入了keyword,請調整table_job以搜索匹配項。但table_job沒有顯示任何內容。我在代碼片段中做了索引2的if block的錯誤,或許我在其他地方錯了?

回答

3

作爲參考,這個完整的example示出了使用setModel()改變TableModel整塊。更新是自動的。也可以考慮使用DefaultTableModel的方法來改變模型。

image

+0

,同時消除了'JScrollPane的窗格=新JScrollPane的(table_job);'使它工作,你的方法也工作:)。爲什麼我在桌上有重複的卷軸呢? – Hoody