繁体   English   中英

基于jtextfield NON区分大小写(Java)过滤JTable

[英]Filter JTable based on a jtextfield NON Case Sensitive (Java)

我已经可以使用JTextField过滤JTable,问题是区分大小写。 例如,我在Jtable中得到了这个名字:“Guillian Fox”,如果我在textField中写“guillian fox”或“GUILLIAN FOX”这个名字没有显示。

我知道java有.toLowerCase或.toUpperCase方法,但是使用这些方法的问题是结果是不雅观的,因为两者都必须是大写或小写,当适当的是大写的第一个字母时,因为是名字。

JTable的行来自数据库中的查询。 所以,我想的解决方案是不直接在jtable中进行过滤,而不是那样,做一个过滤结果的查询,但我认为是非常低效的,因为我会对插入或删除的每个字符进行查询textField。

@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));

    }

忽略CaseWhatever

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

但是对于非ASCII语言,你必须检查键盘上与Big ENTER一致的四个键(2x2),

如果您关注此问题,那么您必须从键盘中排除这四个键并为UpperCase和LoverCase编写自己的矩阵

你可以做这样的事情(几乎按照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;
        }            
    };

这应匹配具有至少一个字段的任何行,其中文本表示包含您创建匹配器的字符串。 可能必须根据您的模型调整类型。

也许有人会帮我解决。 我的问题:我有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中的数据低于或高于+它根据定义的区域设置从上到下翻译无关紧要。

希望会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM