2013-01-02 42 views
1

我有一個來自數據庫的數據填充了JTable。當數據輸入到JTextField中時,我添加了一個搜索函數來突出顯示單元格。但是在一分鐘內,您必須鍵入確切的單詞或數字,我想要做的就是隻能搜索幾個字母或數字,而JTable將顯示包含這些字母或數字的結果。在JTable中搜索通過JTextField數據輸入的數據

我曾嘗試使用:

button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      String text = jTextField1.getText(); 
      if (text.length() == 0) { 
       sorter.setRowFilter(null); 
      } else { 
       sorter.setRowFilter(RowFilter.regexFilter(text)); 
      } 
     } 
    }); 

但它確實影響到JTable中。

所以我用這段代碼:

private class HighlightRenderer extends DefaultTableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 

     // everything as usual 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     // added behavior 
     if(row == table.getSelectedRow()) { 

      // this will customize that kind of border that will be use to highlight a row 
      setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK)); 
     } 

     return this; 
    } 
} 

private void searchResultsActionPerformed(ActionEvent evt) { 
    String value = jTextField1.getText(); 

    for (int row = 0; row <= table.getRowCount() - 1; row++) { 

     for (int col = 0; col <= table.getColumnCount() - 1; col++) { 

      if (value.equals(table.getValueAt(row, col))) { 

       // this will automatically set the view of the scroll in the location of the value 
       table.scrollRectToVisible(table.getCellRect(row, 0, true)); 

       // this will automatically set the focus of the searched/selected row/value 
       table.setRowSelectionInterval(row, row); 

       for (int i = 0; i <= table.getColumnCount() - 1; i++) { 

        table.getColumnModel().getColumn(i).setCellRenderer(new HighlightRenderer()); 
       } 
      } 
     } 
    } 
} 

使用類型爲JTextField中的數據,作品,但像我前面提到的,你必須鍵入確切的名稱或編號。這不是我希望它工作的方式。

任何幫助表示讚賞。

+0

阿爾特本地解決方案,您可以嘗試[SwingX的搜索演示](http://swingx.java.net/)。 – AsirC

回答

3

您的測試

value.equals(table.getValueAt(row, col)) 

導致您所描述的行爲。 equals只適用於完全匹配。

你可以嘗試一些更復雜的像

Object value = table.getValueAt(row, col); 
if (value!=null && value.toString().matches(".*"+Pattern.quote(text)+".*")) 
    ... 

Personnally,這樣所有匹配的單元格都強調我會在你的渲染器執行這個測試(您仍然需要執行在該scrollRect()但不渲染器):

private class HighlightRenderer extends DefaultTableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 

     // everything as usual 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     // added behavior 
     if (value!=null && value.toString().matches(".*"+Pattern.quote(text)+".*")) { 

      // this will customize that kind of border that will be use to highlight a row 
      setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK)); 
     } else 
      setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1); 

     return this; 
    } 
} 

而且evertyime的actionPerformed叫,我將調用table.repaint();

+1

感謝您的回覆!我已將HighlightRenderer更改爲您提供的那個,但我不知道如何處理actionPerformed。你能提供任何幫助嗎? –

+0

@PatrickDibb只需調用'table.repaint()',並可能嘗試滾動到第一個匹配項。理想情況下,這一切都將在你的'TableModel'中完成,並且你會從模型中激發事件,但是我上面描述的方式應該已經可以做到。 –