2014-06-15 4 views
2

데이터베이스의 데이터로 채워진 JTable이 있습니다. JTextField에 데이터를 입력 할 때 단어가 일부 행과 일치하면 행을 표시하는 검색 기능을 추가했습니다. 그러나 분 단위로 문자열이나 단어를 입력하면 모든 행을 숨기고 싶습니다. JTable은 열 이름 만 표시합니다. IT와 일치하는 것과 마찬가지로 사용자가 입력 한 문자열이있는 행만 표시하고 다른 행은 숨 깁니다. 당신은 행 필터와 함께, DocumentListener를 사용하려면Java JTable - 문자열과 일치하는 행만 표시합니다.

   if (text.length() == 0) { 
       sorter.setRowFilter(null); 
       } else { 
       try { 
        sorter.setRowFilter(
         RowFilter.regexFilter(text)); 
       } catch (PatternSyntaxException pse) { 
        System.err.println("Bad regex pattern"); 
       } 
       } 
      } 
+0

참조 : http://stackoverflow.com/q/24218546/ 간단한 해결책은 131872를 참조하십시오. – camickr

답변

4

:

여기 내가 사용하고 내 코드입니다. Write a DocumentListener을 (를) 볼 수 있습니다.

기본적으로 청취자는 텍스트 필드의 기본 문서에서 변경 사항을 수신합니다. DocumentListener에서 재정의하는 메서드에서 현재 수행중인 것처럼 텍스트를 가져올 수 있으며 현재 수행중인 것처럼 정규식 필터를 설정할 수 있습니다.

여기 애플릿을 무시하고 간단한 예제가 있습니다. 상용구 코드 this post에서 문서 수신기를 추가했습니다. 참고 : 동일한 게시물에 해당 기능을 찾으려면 대소 문자를 구분하지 않고 필터링 할 수있는 답변이 제공됩니다.

import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.RowFilter; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class TestTableSorterFilter extends JApplet { 

    private String[] columnNames 
      = {"Country", "Capital", "Population in Millions", "Democracy"}; 

    private Object[][] data = { 
     {"USA", "Washington DC", 280, true}, 
     {"Canada", "Ottawa", 32, true}, 
     {"United Kingdom", "London", 60, true}, 
     {"Germany", "Berlin", 83, true}, 
     {"France", "Paris", 60, true}, 
     {"Norway", "Oslo", 4.5, true}, 
     {"India", "New Delhi", 1046, true} 
    }; 

    private JTable jTable = new JTable(data, columnNames); 

    private TableRowSorter<TableModel> rowSorter 
      = new TableRowSorter<>(jTable.getModel()); 

    private JTextField jtfFilter = new JTextField(); 
    private JButton jbtFilter = new JButton("Filter"); 

    public TestTableSorterFilter() { 
     jTable.setRowSorter(rowSorter); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(new JLabel("Specify a word to match:"), 
       BorderLayout.WEST); 
     panel.add(jtfFilter, BorderLayout.CENTER); 

     add(panel, BorderLayout.SOUTH); 
     add(new JScrollPane(jTable), BorderLayout.CENTER); 

     jtfFilter.getDocument().addDocumentListener(new DocumentListener(){ 

      @Override 
      public void changedUpdate(DocumentEvent arg0) {} 

      @Override 
      public void insertUpdate(DocumentEvent arg0) { 
       String text = jtfFilter.getText(); 

       if (text.trim().length() == 0) { 
        rowSorter.setRowFilter(null); 
       } else { 
        rowSorter.setRowFilter(RowFilter.regexFilter(text)); 
       } 
      } 

      @Override 
      public void removeUpdate(DocumentEvent arg0) { 
       String text = jtfFilter.getText(); 
       if (text.trim().length() == 0) { 
        rowSorter.setRowFilter(null); 
       } else { 
        rowSorter.setRowFilter(RowFilter.regexFilter(text)); 
       } 
      } 
     }); 
    } 
} 
+0

+1하지만 나는 그것이되어야한다고 생각합니다 [rowFilter = RowFilter.regexFilter ("(? i)"+ filterText);] (http://stackoverflow.com/a/14102764/714968), "(? i) "대소 문자를 구분하지 않고 대문자와 lovercase 문자를 같은 방식으로 사용합니다. – mKorbel

+0

@mKorbel 내가 질문 한 내용의 링크를 게시했습니다. 그 방법을 보여줍니다. –

+0

가끔씩 나는 쉼표를 읽으려고 계속합니다. – mKorbel