2014-05-14 2 views
0

4 개의 열 (이름, 범주, 기간, 파일 크기)과 JTable의 특정 레코드를 찾기 위해 구를 입력하는 JTextField가있는 JTable이 있습니다.JTable의 단일 열을 필터링하는 정규식입니다.

나는이 방법으로 레코드를 필터링 which'd 정규식 수식이 필요할 것 :

JTable의 :

이름 | 카테고리 | 기간 | 파일 크기

Linkin.Park | 고양이 1 | 00:03:30 | 5,30

문구를 입력하면 친족 - 이름 안에 "친족"이있는 모든 노래가 표시됩니다.

phrase : lin * ar *을 입력하면 "lin"로 시작하는 모든 노래가 표시되고 그 다음에 "ar"이있는 문자가 표시됩니다.

*에 *를 입력하면 "lin"으로 시작하는 모든 노래가 표시되고 1자를 입력 한 다음 "in"을 입력 한 다음 문자를 입력합니다.

또한 JTable (name)의 첫 번째 열만 고려하면 필터가 필요합니다. 예를 들어 30 *은 30으로 시작하는 노래를 표시하지만 시작하지 않는 노래는 표시하지 않습니다. 예를 들어 3시 30 분의 지속 시간 또는 파일 크기 (예 : 7,30).

제 영어 xD는 유감입니다.

private void search(String text) { 
      TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableUtwory.getModel()); 
      tableUtwory.setRowSorter(sorter); 
      String regex; 
      if(text.startsWith("*") && text.endsWith("*")) { 
        String s = Pattern.quote(text.replaceAll("^\\*|\\*$", "")); 
        regex = "(?i).+" + s + ".+"; 
      } else if(text.startsWith("*")) { 
        String s = Pattern.quote(text.replaceAll("^\\*", "")); 
        regex = "(?i).+" + s + "$"; 
      } else if(text.endsWith("*")) { 
        String s = Pattern.quote(text.replaceAll("\\*$", "")); 
        regex = "(?i)^" + s + ".+"; 
      } else { 
        String s = Pattern.quote(text); 
        regex = "(?i)^" + s + "$"; 
      } 
    sorter.setRowFilter(RowFilter.regexFilter(regex)); 
    sorter.setSortKeys(null); 
} 

을하지만 삽입 할 경우 (예 : 린 * AR *에 대한) 문자 사이에 "*"어떤 결과를 반환하지 않으며, 난 몰라 :

지금은 검색의 종류가 "?"를 사용할 수있는 옵션이 있습니다.

: 지금은 다른 열을 생각 나는 입력 "30 *"그것은 또한 크기 나 지속 시간이 질문의 30

+1

와일드 카드 일치를 원합니다. 몇 가지 아이디어에 대해서는이 질문을 참조하십시오. http : // stackoverflow.com-questions-1247772/java-util-regex-for-glob-type 패턴과 동일합니다. 좀 더 구체적인 도움이 필요하면 문제에 대해 좀 더 구체적으로 설명해야한다고 덧붙여 야합니다. [최소한의 작업 예제] (http://www.sscce.org/)는 좋을 것입니다. – MattLBeck

+3

이 작업을 수행하기 위해 귀하의 노력은 보이지 않습니다. 이것은 "나는 이것과 저것, 그리고 저것을 원한다"고 말할 수있는 사이트가 아닙니다 ... 우리는 당신의 노력을보아야 만합니다 ... –

답변

0

두 번째 부분이 노래를 반환합니다 그래서 만약 또한,뿐만 아니라, 열 이름 어쨌든

for (int i=0; i<=dataValues.length; i++) { 
    String s = dataValues[i][0]; 
} 

, 당신은, 당신의 JTable에 대해 특히 데이터 모델을 자세한 정보를 제공 할 수있다 : 당신은 단지 dataValues ​​(또는 당신이 그것을 붙인) 두 차원 배열, 등의 첫 번째 열을 통과해야?

첫 번째 부분은 가장 쉬운 방법은 JTextField를 정규식으로 읽는 것이지만 * 및/또는? 만 포함되어 있는지 확인해야합니다. regex 문자가 위의 String s 값과 일치하는지 확인하십시오. 그리고 당신은 변형해야합니까? 당신이 JTable가의 datavalues ​​설정 하나 그렇지 않은 경우에.에 {1}과 *. *

는, 당신은 ...

public static Object[][] getTableData(JTable table) { 
DefaultTableModel dtm = (DefaultTableModel) table.getModel(); 
int nRow = dtm.getRowCount(), nCol = dtm.getColumnCount(); 
Object[][] tableData = new Object[nRow][nCol]; 
for (int i = 0 ; i < nRow ; i++) 
    for (int j = 0 ; j < nCol ; j++) 
     tableData[i][j] = dtm.getValueAt(i,j); 
return tableData; 
} 

Object[][] dataValues = getTableData(YourJTable); 

String regex; 
if (s.indexOf("*") != -1) { 
    regex = s.replaceAll("*", ".*"); 
} 
if (regex.indexOf("?") != -1) { 
    regex = regex.replaceAll("?", ".{1}"); 
} 
for (int i=0; i<=dataValues.length; i++) { 
     String s2 = (String) dataValues[i][0]; 
     if (s2.matches(regex)) { 
     System.out.println("Match: " + s2); 
     } else { 
     System.out.println("Not match: " + s2); //for debugging 
     } 
} 

}

JTable로에서 직접 얻을 수 있습니다

누군가가 JTextField에서 정규 표현식에 대한 특수 문자 또는 조합을 쓰는 경우 모든 내용이 엉망이되어 올바른 입력을 처리해야한다는 점에 유의하십시오.

관련 문제