e3e6
5/10/2012 - 9:11 AM

JTable filtering

JTable filtering

/* Спасибо за инфу. 
 * В конечном счёте мне нужно было добавить несколько фильтров на таблицу, поэтому у меня получился вот 
 * такой код, который, кстати говоря, даже работает: =)) Хотя выглядит нагромождённо... Вобщем, оставляю
 * код, если у кого-то когда-то возникнет похожая проблема. 
 * Ну, а если будут мысли как тоже самое написать более проще, то с удовольствием поучусь.
 * (c) http://www.sql.ru/forum/actualthread.aspx?tid=789123
 */

CaretListener listener = new CaretListener() {
          public void caretUpdate(CaretEvent caretEvent) {
              try {
                    java.util.List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(3);
                    filters.add(RowFilter.regexFilter("(?i)" + txtRegNum.getText(),0));
                    filters.add(RowFilter.regexFilter("(?i)" + txtFirstName.getText(),1));
                    filters.add(RowFilter.regexFilter("(?i)" + txtLastName.getText(),2));
                    filters.add(RowFilter.regexFilter("(?i)" + txtProfession.getText(),3));
                    filters.add(RowFilter.regexFilter("(?i)" + txtSex.getText(),4));
                    filters.add(RowFilter.regexFilter("(?i)" + txtDateofBirth.getText(),5));

                    RowFilter<Object,Object> serviceFilter = RowFilter.andFilter(filters);
                    sorter.setRowFilter(serviceFilter);
              }  catch (Exception e)
              {
                   System.out.println(e.getMessage());
              }
          }
        };

        txtRegNum.addCaretListener(listener);
        txtFirstName.addCaretListener(listener);
        txtLastName.addCaretListener(listener);
        txtProfession.addCaretListener(listener);
        txtSex.addCaretListener(listener);
        txtDateofBirth.addCaretListener(listener); 
// (c) http://www.sql.ru/forum/actualthread.aspx?tid=507673

System.out.println(Pattern.compile("ТесТ",Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE).matcher("aaa тест bbb").replaceAll("<test>ТесТ</test>"));
Все оказывается очень просто для английских букв:

RowFilter.regexFilter("(?i)" + line)

Но с кириллицей такой фокус не проходит. Приходится изловчатся так:

StringBuilder newPattern = new StringBuilder();
char c = pattern.charAt(i);
newPattern.append('[');
newPattern.append(Character.toLowerCase(c));
newPattern.append(Character.toUpperCase(c));
newPattern.append(']');

и так для каждой буквы