2011-11-27 66 views
2

我已经可以使用JTextField过滤JTable,问题在于区分大小写。例如,我在Jtable中得到了这个名字:“Guillian Fox”,如果我在文本字段中输入“guillian fox”或者“GUILLIAN FOX”,则名称不会显示。 toUpperCase方法,但是使用这种方法的问题是结果会变得难看,因为两者都必须是大写或小写,当适当的时候会是大写的第一个字母,因为是名字。 JTable的行来自数据库中的查询,所以我想的解决方案是不要直接在jtable中执行过滤器,而是做一个过滤结果的查询,但我认为效率很低我将查询插入或从textField中删除的每个字符。基于jtextfield过滤JTable非区分大小写(Java)

@Override 
    public void changedUpdate(DocumentEvent arg0) { 
     ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0)); 

    } 

    @Override 
    public void insertUpdate(DocumentEvent arg0) { 
     ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0)); 

    } 

    @Override 
    public void removeUpdate(DocumentEvent arg0) { 
     ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0)); 

    } 

回答

8

为忽略CaseWhatever

ordenador.setRowFilter(RowFilter.regexFilter("(?i)" + text)); 

但对于非ASCII launguages,你必须检查符合四个关键(2×2)与/大附近ENTER键盘上,

如果你rellated有了这个问题,那么你必须从键盘上排除这四个键,并为UpperCase和LoverCase编写自己的矩阵。

+0

一个简单的解决方案:) 我不明白最后一部分?用非ASCII语言表示例如口音或特殊字符(á,í,û)?你的意思是“检查四键(2x2)”吗? –

+0

很高兴帮助你+1,我来自非ASCII相关国家,我有问题,右键上方Right_Shift和下一个ENTER键有四个键,有四个键,斯洛伐克语区域有(ú,ä,ň)在Windows操作系统中设置) – mKorbel

1

你可以做这样的事情(几乎和Java文档一样复制)

public class ContainsIgnoreCaseFilter extends RowFilter<Object, Object> { 

     private final String match; 

     public ContainsIgnoreCaseFilter(String match) { 
      this.match = match.toLowerCase(); 
     } 

     @Override 
     public boolean include(javax.swing.RowFilter.Entry<? extends Object, ? extends Object> entry) { 
      for (int i = entry.getValueCount() - 1; i >= 0; i--) { 
       if (entry.getStringValue(i).toLowerCase().contains(match)) { 
        return true; 
       } 
       } 
       return false; 
     }    
    }; 

这应该与具有至少一个领域,其中的文字表述包含您创建一个匹配字符串的任何行。类型可能需要根据您的模型进行调整。

+0

我不明白为什么这次被拒绝,是因为我不仅仅展示了如何精确过滤要求的内容,而且还说明了如何制作自己的过滤器? –

+1

也许['toLowerCase(Locale locale)'](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#toLowerCase%28java.util.Locale%29)? –

+0

是的,你没有使用那里有什么,但重新发明了轮子:过滤文本的方式是RowFilter.regexFilter - 无需手工编码 – kleopatra

0

也许某人会帮助我的解决方案。我的问题:我有JTable,JTable中的数据包含国家字符(带尖锐和楔形)。我将JTextField作为RowFilter的输入。

在JTextField中我的DocumentListener:

textFielInput.getDocument().addDocumentListener(new DocumentListener(){ 
@Override 
public void changedUpdate(DocumentEvent e){ 
    applyFilter(); 
} 

@Override 
public void insertUpdate(DocumentEvent e){ 
    applyFilter(); 
} 

@Override 
public void removeUpdate(DocumentEvent e){ 
    applyFilter(); 
} 

});

再实施的RowFilter的:

private void applyFilter() 
{ 
    RowFilter<MyTableModel, Integer> filter = null; 
    final String filteringText = this.textFielInput.getText().toLowerCase(new Locale("cs_CZ")); 
    filter = new RowFilter<MyTableModel, Integer>() 
    { 
     @Override 
     public boolean include(Entry<? extends MyTableModel, ? extends Integer> entry) 
     { 
      for(int i = entry.getValueCount() - 1; i >= 0; i--) 
      { 
       String filteredField = entry.getStringValue(i).toLowerCase(new Locale("cs_CZ")); 
       if(filteredField.contains(filteringText)) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 
    }; 
} 
this.sorter.setRowFilter(filter); 

课程之一,需要分拣机:

sorter = new TableRowSorter<MyTableModel>(new MyTableModel()); 

以这种方式并不重要,如果在搜索框中粘贴的文本是大写或小写如果JTable中的数据较低或较高,它将根据定义的语言环境将其翻译为较高或较低,这并不重要。

希望会有所帮助。