[英]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.