Сортировка и фильтрация таблиц

Java Standard Edition (Java SE) 6.0 (кодовое имя Mustang), добавлены некоторые функции, которые делают сортировку и фильтрацию содержимого Swing JTable гораздо проще. (Окончательного включения этих элементов, при условии одобрения JCP.) Большинство современных таблично ориентированные пользовательские интерфейсы позволяют пользователям для сортировки столбцов, нажав на заголовок таблицы. Это может быть сделано с Swing JTable поддержку на месте до Mustang. Однако функциональность пришлось добавлять вручную в пользовательский путь для каждой таблицы, которые необходимы этой функцией. С Mustang, включение этой функциональности требует минимальных усилий. Фильтрация Другим вариантом является широко доступны с пользовательскими интерфейсами. Фильтрация позволяет отображать только те строки в таблице, которые соответствуют пользователем критериями. С Mustang, позволяя фильтрации содержимого JTable также намного легче.

Sorting Rows

Основой для сортировки и фильтрации строк в Mustang является абстрактным классом RowSorter. RowSorter ведение двух отображений, одна из строк в JTable с элементами базовой модели, и обратно. Это позволяет сделать одну сортировку и фильтрацию. Класс общей достаточно для работы как с TableModel и ListModel. Однако только TableRowSorter обеспечивается Mustang библиотек для работы с JTable.

В простейшем случае вы передаете TableModel конструктору TableRowSorter, а затем передать создал RowSorter в setRowSorter () класса JTable. Вот пример программы, SortTable, который демонстрирует подход:


   import javax.swing.*;

   import javax.swing.table.*;

   import java.awt.*;



   public class SortTable {

     public static void main(String args[]) {

       Runnable runner = new Runnable() {

        public void run() {

           JFrame frame = new JFrame("Sorting JTable");

           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           Object rows[][] {

               {"AMZN""Amazon"41.28},

               {"EBAY""eBay"41.57},

               {"GOOG""Google"388.33},

               {"MSFT""Microsoft"26.56},

               {"NOK""Nokia Corp"17.13},

               {"ORCL""Oracle Corp."12.52},

               {"SUNW""Sun Microsystems"3.86},

               {"TWX",  "Time Warner"17.66},

               {"VOD",  "Vodafone Group"26.02},

               {"YHOO""Yahoo!"37.69}

             };

           String columns[] {"Symbol""Name""Price"};

           TableModel model =

               new DefaultTableModel(rows, columns) {

             public Class getColumnClass(int column) {

               Class returnValue;

               if ((column >= 0&& (column < getColumnCount())) {

                 returnValue = getValueAt(0, column).getClass();

               else {

                 returnValue = Object.class;

               }

               return returnValue;

             }

           };



           JTable table = new JTable(model);

           RowSorter<TableModel> sorter =

             new TableRowSorter<TableModel>(model);

           table.setRowSorter(sorter);

           JScrollPane pane = new JScrollPane(table);

           frame.add(pane, BorderLayout.CENTER);

           frame.setSize(300150);

           frame.setVisible(true);

         }

       };

       EventQueue.invokeLater(runner);

     }

   

javax.swing

Щелкните по одному из столбцов таблицы отображаются, и заметил, что поменяется содержание столбца.

javax.swing

Вы можете спросить, почему бы просто не использовать DefaultTableModel, в отличие от создания пользовательского подкласса это? Ответом является то, что TableRowSorter имеет набор правил, которые вытекают для сортировки столбцов. По умолчанию все столбцы таблицы, как считается, тип объекта. Таким образом, сортировка производится по телефону ToString (). По умолчанию главная getColumnClass () поведение DefaultTableModel, RowSorter сортов в соответствии с правилами этого класса, предполагая, он реализует сопоставимы. Вы также можете установить пользовательские компаратора для колонки по телефону setComparator (INT столбцов, компаратор компаратор).

Ключевые три строки в SortTable программы, имеющие отношение к сортировке показано здесь:


           JTable table = new JTable(model);

           RowSorter<TableModel> sorter =

             new TableRowSorter<TableModel>(model);

           table.setRowSorter(sorter);

Первая линия связывает модель с таблицей. Вторая строка создает RowSorter конкретной модели. Третья линия связывает RowSorter с JTable. Это позволяет пользователю нажмите на заголовок столбца для сортировки столбца. Щелчок второй раз на том же столбце меняет порядок сортировки.

Если вы хотите добавить свои собственные действия, когда изменения порядка сортировки, вы можете прикрепить к RowSorterListener RowSorter. Интерфейс имеет один метод:

void sorterChanged(RowSorterEvent e)

Метод позволяет обновлять текста в строке состояния, или выполнять некоторые дополнительные задачи. RowSorterEvent для действия позволяет узнать, сколько строк было до настоящего рода, в том случае, RowSorter отфильтрованные строки или вне поля зрения.

Filtering Table Rows

Вы можете связать с RowFilter TableRowSorter и использовать ее для фильтрации содержимого таблицы. Например, вы можете использовать RowFilter такие, что в таблице отображаются только те строки, где имя начинается с буквы или там, где цена акций превышает $ 50. Абстрактный класс RowFilter имеет один метод, который используется для фильтрации:

boolean include(RowFilter.Entry entry)

Для каждой записи в модели, связанной с RowSorter, метод указывает, является ли указанный запись должна быть показана в текущем представлении модели. Во многих случаях вам не нужно создавать собственную реализацию RowFilter. Вместо этого, RowFilter предлагает шесть статические методы для создания фильтров.

  • andFilter(Iterable<? extends RowFilter<? super M,? super I>> filters)
  • dateFilter(RowFilter.ComparisonType type, Date date, int… indices)
  • notFilter(RowFilter<M,I> filter)
  • numberFilter(RowFilter.ComparisonType type, Number number, int… indices)
  • orFilter(Iterable<? extends RowFilter<? super M,? super I>> filters)
  • regexFilter(String regex, int… indices)

Для завода RowFilter методы, которые аргументом индексов (dateFilter, numberFilter, regexFilter), только множество столбцов, соответствующих указанным индексы проверяются в модели. Если параметры не указаны индексы, все столбцы проверяются на соответствие.

DateFilter позволяет проверить соответствие даты. NumberFilter проверяет соответствие номера. NotFilter используется для изменения еще один фильтр, иными словами, оно включает записи, которые поставляются фильтра не включать. Вы можете использовать его, чтобы делать вещи, как найти записи, где-то не было сделано по 12/25/2005. AndFilter и orFilter предназначены для логического объединения другими фильтрами. RegexFilter использует регулярные выражения для фильтрации. Вот программа, FilterTable, который использует regexFilter фильтровать содержимое таблицы:


   import javax.swing.*;

   import javax.swing.table.*;

   import java.awt.*;

   import java.awt.event.*;

   import java.util.regex.*;



   public class FilterTable {

     public static void main(String args[]) {

       Runnable runner = new Runnable() {

         public void run() {

           JFrame frame = new JFrame("Sorting JTable");

           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           Object rows[][] {

             {"AMZN""Amazon"41.28},

             {"EBAY""eBay"41.57},

             {"GOOG""Google"388.33},

             {"MSFT""Microsoft"26.56},

             {"NOK""Nokia Corp"17.13},

             {"ORCL""Oracle Corp."12.52},

             {"SUNW""Sun Microsystems"3.86},

             {"TWX",  "Time Warner"17.66},

             {"VOD",  "Vodafone Group"26.02},

             {"YHOO""Yahoo!"37.69}

           };

           Object columns[] {"Symbol""Name""Price"};

           TableModel model =

              new DefaultTableModel(rows, columns) {

             public Class getColumnClass(int column) {

               Class returnValue;

               if ((column >= 0&& (column < getColumnCount())) {

                 returnValue = getValueAt(0, column).getClass();

               else {

                 returnValue = Object.class;

               }

               return returnValue;

             }

           };

           JTable table = new JTable(model);

           final TableRowSorter<TableModel> sorter =

                   new TableRowSorter<TableModel>(model);

           table.setRowSorter(sorter);

           JScrollPane pane = new JScrollPane(table);

           frame.add(pane, BorderLayout.CENTER);

           JPanel panel = new JPanel(new BorderLayout());

           JLabel label = new JLabel("Filter");

           panel.add(label, BorderLayout.WEST);

           final JTextField filterText =

               new JTextField("SUN");

           panel.add(filterText, BorderLayout.CENTER);

           frame.add(panel, BorderLayout.NORTH);

           JButton button = new JButton("Filter");

           button.addActionListener(new ActionListener() {

             public void actionPerformed(ActionEvent e) {

               String text = filterText.getText();

               if (text.length() == 0) {

                 sorter.setRowFilter(null);

               else {

                 try {

                   sorter.setRowFilter(

                       RowFilter.regexFilter(text));

                 catch (PatternSyntaxException pse) {

                   System.err.println("Bad regex pattern");

                 }

               }

             }

           });

           frame.add(button, BorderLayout.SOUTH);

           frame.setSize(300250);

           frame.setVisible(true);

         }

       };

       EventQueue.invokeLater(runner);

     }

   }

Дисплей устанавливает фильтр для всех строк с символами ВС где-то в них. Это указано в строке "ВС". Использование символа '^' и '$' для проверки на точное совпадение в начале и конце строки соответственно.

javax.swing

Фильтр используется внутри Matcher.find () для включения испытания, когда пользователь нажимает на кнопку "Фильтр" в нижней части.

javax.swing

Изменить текст фильтра для изменения множества строк показано в таблице. Если вы хотите увидеть все строки в таблице, удалите текст фильтра.

Последнее, что стоит отметить — при сортировке и фильтрации, выбор в плане представления. Так что если вам необходимо отобразить на базовую модель, вам необходимо позвонить convertRowIndexToModel () метод. Аналогично, если вы хотите перейти от модели к мнению нужно использовать convertRowIndexToView ().

Для получения дополнительной информации о RowSorter, TableRowSorter и RowFilter см. Javadoc для соответствующих классов:

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>