Первое, что вам нужно, чтобы подумать, это то, что 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();
}
});
}
}