【问题标题】:Glazedlists: get result after action performed in FilterListGlazedlists:在 FilterList 中执行操作后获取结果
【发布时间】:2014-05-10 23:47:15
【问题描述】:

我有一个 jtable,我可以使用 Glazedlists 的 TextComponentMatcherEditor 进行过滤...而且我有一个显示该表格行数的 textField... 应用过滤器后如何获取行数? 在过滤器上插入的每个键,都必须更新 textFiled...

希望我的问题很清楚,谢谢

【问题讨论】:

    标签: java filter action glazedlists


    【解决方案1】:

    大概你在某个地方有一个FilterList,它的工作是处理源事件列表和匹配器编辑器之间的过滤。在这种情况下,您只需调用 FilterList.size() 即可获取现有项目的数量。

    当然,在列表发生变化时做出反应是基本步骤。因为 GlazedLists 是关于列表上的“事件”的,所以您不会对有一些简单的方法可以在发生更改时进行监听,EventList.addListEventListener() 就是一个明显的例子。

    我编写了一个 JTable 的小示例程序,它连接了 GlazedLists 方式并对文本字段过滤器做出反应。 GUI 的底部是一个 JLabel,它显示当前显示的项目数。

    注意,我只再次测试了 GlazedLists v1.8,但我认为回到 v1.5 应该没问题。

    import ca.odell.glazedlists.BasicEventList;
    import ca.odell.glazedlists.EventList;
    import ca.odell.glazedlists.FilterList;
    import ca.odell.glazedlists.GlazedLists;
    import ca.odell.glazedlists.SortedList;
    import ca.odell.glazedlists.TextFilterator;
    import ca.odell.glazedlists.event.ListEvent;
    import ca.odell.glazedlists.event.ListEventListener;
    import ca.odell.glazedlists.gui.TableFormat;
    import ca.odell.glazedlists.matchers.ThreadedMatcherEditor;
    import ca.odell.glazedlists.swing.EventTableModel;
    import ca.odell.glazedlists.swing.TextComponentMatcherEditor;
    import java.awt.BorderLayout;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    
    public class TextFilterCount {
    
    
        private EventList<Person> eventList = new BasicEventList<Person>();
    
        public TextFilterCount() {
            setupGui();
            populateTable();
        }
    
        private void populateTable() {
            eventList.add(new Person("Charles", "Dickens"));
            eventList.add(new Person("George", "Orwell"));
            eventList.add(new Person("John", "Steinbeck"));
            eventList.add(new Person("Jospeh", "Heller"));
        }
    
        private void setupGui() {
            JFrame frame = new JFrame("GlazedListed TextFilter count example");
    
            final JLabel countLabel = new JLabel();
    
            frame.setSize(600, 400);
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JTextField textField = new JTextField();
    
            SortedList sortedList = new SortedList(eventList);
    
            TextFilterator<Person> personFilterator = new TextFilterator<Person>() {
                @Override
                public void getFilterStrings(List baseList, Person person) {
                    baseList.add(person.getFirstName());
                    baseList.add(person.getLastName());
                }
            };
    
            TextComponentMatcherEditor matcherEditor = new TextComponentMatcherEditor(textField, personFilterator);
            final FilterList filteredList = new FilterList(sortedList, new ThreadedMatcherEditor(matcherEditor));
    
            filteredList.addListEventListener(new ListEventListener() {
    
                @Override
                public void listChanged(ListEvent le) {
                    System.out.println("List changed.");
                    countLabel.setText("" + filteredList.size());
                }
            });
    
            String[] propertyNames = new String[] {"firstName", "lastName"};
            String[] columnLabels = new String[] {"First name", "Last name"};
    
            TableFormat tf = GlazedLists.tableFormat(Person.class, propertyNames, columnLabels);
            JTable table = new JTable(new EventTableModel(filteredList, tf));
    
            JPanel mainPanel = new JPanel(new BorderLayout());
    
            mainPanel.add(textField, BorderLayout.NORTH);
            mainPanel.add(new JScrollPane(table), BorderLayout.CENTER);
    
            mainPanel.add(countLabel, BorderLayout.SOUTH);
    
            frame.getContentPane().add(mainPanel);
            frame.setVisible(true);
        }
    
    
        public class Person implements Comparable<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 void setFirstName(String firstName) {
                this.firstName = firstName;
            }
    
            public String getLastName() {
                return lastName;
            }
    
            public void setLastName(String lastName) {
                this.lastName = lastName;
            }
    
            @Override
            public int compareTo(Person p) {
                if (this.getLastName().equals(p.getLastName())) {
                    return this.getFirstName().compareTo(p.getFirstName());
                }
    
                return this.getLastName().compareTo(p.getLastName());
            }   
        }
    
        public static void main(String[] args) {
            new TextFilterCount();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 2012-02-20
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多