Фильтрация отдельных столбцов Java GlazedList - PullRequest
0 голосов
/ 13 мая 2018

В настоящее время у меня есть таблица с текстовым полем в заголовках отдельных столбцов, которая выполняет фильтрацию по каждому отдельному столбцу. Вместо этого я пытаюсь использовать застекленный список, но как мне это сделать?Каждый столбец должен иметь отдельное текстовое поле, и фильтрация выполняется на основе всех текстовых полей, которые фильтруются на основе отдельных столбцов.Например: таблица с колонками «Имя» и «Фамилия».Таблица будет фильтровать результаты на основе имени человека по имени в фильтре имени и фамилии по фильтру фамилии

1 Ответ

0 голосов
/ 14 мая 2018

Первое, что вам нужно, чтобы подумать, это то, что GlazedLists в первую очередь предназначен для обработки списков объектов - ключ к названию.Многие люди рассматривают его как библиотеку для добавления возможностей сортировки и фильтрации к таблицам и спискам, что гарантированно вызывает головную боль.

Итак, прежде всего, обратите внимание на тот факт, что GlazedLists предоставит вам специальный тип структуры списка, называемый EventList, который является вашей базовой структурой данных;оттуда вам будут предоставлены полезные методы для преобразования, сортировки, фильтрации и т. д. А затем, поскольку он очень щедрый, есть простые в использовании классы для связывания вашего EventList с JList или JTable.

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

В любом случае, вот пример класса, который покажет вам, как вы создаете EventList, а затем применитьтекстовые фильтры через компонент Swing, а затем связать все это с таблицей Swing.(Это не касается сортировки или получения выбранных элементов, но документы превосходны.)

Протестировано с Java 9 и GlazedLists 1.11.

import ca.odell.glazedlists.*;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.matchers.MatcherEditor;
import ca.odell.glazedlists.swing.DefaultEventSelectionModel;
import ca.odell.glazedlists.swing.DefaultEventTableModel;
import ca.odell.glazedlists.swing.TextComponentMatcherEditor;

import javax.swing.*;
import java.awt.*;
import java.util.List;

public class GlazedListsMultipleTextfields {

    private JFrame frame;
    private JTable table;
    private JTextField txtFirstName;
    private JTextField txtLastName;

    private EventList people;
    private DefaultEventSelectionModel selectionModel;

    public GlazedListsMultipleTextfields() {

        setupGui();
        setupGlazedLists();
        populatedList();
        frame.setVisible(true);
    }

    private void setupGui() {

        frame = new JFrame("GlazedLists Multiple Filter Examples");
        frame.setSize(600, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create the panel to hold the input textfields
        txtFirstName = new JTextField();
        JPanel pnlFirstName = new JPanel(new BorderLayout());
        pnlFirstName.add(new JLabel("First name"), BorderLayout.WEST);
        pnlFirstName.add(txtFirstName, BorderLayout.CENTER);

        txtLastName = new JTextField();
        JPanel pnlLastName = new JPanel(new BorderLayout());
        pnlLastName.add(new JLabel("Last name"), BorderLayout.WEST);
        pnlLastName.add(txtLastName, BorderLayout.CENTER);

        JPanel textInputs = new JPanel();
        textInputs.setLayout(new BoxLayout(textInputs, BoxLayout.Y_AXIS));
        textInputs.add(pnlFirstName);
        textInputs.add(pnlLastName);

        table = new JTable();
        frame.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        frame.getContentPane().add(textInputs, BorderLayout.NORTH);
    }

    private void populatedList() {
        people.add(new Person("John", "Grisham"));
        people.add(new Person("Patricia", "Cornwell"));
        people.add(new Person("Nicholas", "Sparks"));
        people.add(new Person("Andy", "Weir"));
        people.add(new Person("Elizabeth", "George"));
        people.add(new Person("John", "Green"));
    }

    private void setupGlazedLists() {
        people = new BasicEventList();
        MatcherEditor firstNameMatcherEditor = new TextComponentMatcherEditor(txtFirstName, new FirstNameTextFilterator());
        MatcherEditor lastNameMatcherEditor = new TextComponentMatcherEditor(txtLastName, new LastNameTextFilterator());

        FilterList filteredFirstNames = new FilterList(people, firstNameMatcherEditor);
        FilterList filteredLastNames = new FilterList(filteredFirstNames, lastNameMatcherEditor);

        TableFormat tableFormat = GlazedLists.tableFormat(new String[]{"firstName", "lastName"}, new String[]{"First Name", "Last Name"});
        DefaultEventTableModel model = new DefaultEventTableModel(filteredLastNames, tableFormat);
        selectionModel = new DefaultEventSelectionModel(filteredLastNames);

        table.setModel(model);
        table.setSelectionModel(selectionModel);
    }

    class FirstNameTextFilterator implements TextFilterator {

        @Override
        public void getFilterStrings(List list, Person person) {
            list.add(person.getFirstName());
        }
    }

    class LastNameTextFilterator implements TextFilterator {

        @Override
        public void getFilterStrings(List list, Person person) {
            list.add(person.getLastName());
        }
    }

    public class Person {
        private String firstName;
        private String lastName;

        public Person(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GlazedListsMultipleTextfields();
            }
        });
    }
}
...