2011-11-27 68 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中的數據較低或較高,它將根據定義的語言環境將其翻譯爲較高或較低,這並不重要。

希望會有所幫助。