簡體   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