2013-01-02 47 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'中完成,并且你会从模型中激发事件,但是我上面描述的方式应该已经可以做到。 –