合并JTable的两行过滤器 [英] Merging two row filters for a JTable

查看:117
本文介绍了合并JTable的两行过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我桌子的一些代码

    AthleteID.setLocation(200,120); //Sets the location
    AthleteID.setSize(150,26); //Sets the size
    AthleteID.setText("Athlete ID Search:");
    firstPanel.add(AthleteID); //Adds it to the panel

    ForeName.setLocation(731,120); //Sets the location
    ForeName.setSize(150,26); //Sets the size
    ForeName.setText("Athlete Name Search:");
    firstPanel.add(ForeName); //Adds it to the panel

    String[] aHeaders = {"Athlete ID","Forename","Surname","On The Team"};

    model = new DefaultTableModel(a.compTableData,aHeaders)
    {
        @Override
        public boolean isCellEditable(int row, int column) 
        {
            return false;
        }
    };
    athTable = new JTable(model);
    athTable.setAutoCreateRowSorter(true);
    athTable.setRowHeight(20);

    myScrollTable = new JScrollPane(athTable); 
    myScrollTable.setSize(1082,600); 
    myScrollTable.setLocation(200,145); 
    System.out.println("Creating compare table");

    sorter = new TableRowSorter(athTable.getModel());
    List sortKeys = new ArrayList();
    sortKeys.add(new RowSorter.SortKey(3, SortOrder.DESCENDING));
    sorter.setSortKeys(sortKeys);
    ////////
    sorter.setRowFilter
    (
        new RowFilter<TableModel, Integer>() 
            {
            @Override
            public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) 
                {
                    boolean included = true;
                    Object cellValue = entry.getModel().getValueAt(entry.getIdentifier(), 0);
                    if (cellValue == null || cellValue.toString().trim().isEmpty()) 
                    {
                        included = false;
                    }
                    return included;
                }
            }
    );
    /////////
    sorter.setComparator(0, new AlphanumComparator());

    athTable.setRowSorter(sorter);

    filterAthID = new JTextField(10);
    filterAthID.setSize(425,26); 
    filterAthID.setLocation(306,120);
    filterAthID.setToolTipText("Enter Athlete ID");
    firstPanel.add(filterAthID);

    filterForeName = new JTextField(10);
    filterForeName.setSize(425,26); 
    filterForeName.setLocation(857,120);
    filterForeName.setToolTipText("Enter Athlete Name");
    firstPanel.add(filterForeName);

    btnBack.setLocation(0,120);
    btnBack.setSize(200,50);
    btnBack.setText("Back");
    btnBack.addActionListener(this);
    firstPanel.add(btnBack);

    Document doc = filterAthID.getDocument();
    DocumentListener listener = new DocumentListener() {

        @Override
        public void insertUpdate(DocumentEvent e) 
        {
            newFilter();
        }

        @Override
        public void removeUpdate(DocumentEvent e) 
        {
            newFilter();
        }

        @Override
        public void changedUpdate(DocumentEvent e) 
        {
            newFilter();
        }
    };
    doc.addDocumentListener(listener);

    Document docb = filterForeName.getDocument();
    DocumentListener listenerb = new DocumentListener() {

        @Override
        public void insertUpdate(DocumentEvent e) 
        {
            newFilter();
        }

        @Override
        public void removeUpdate(DocumentEvent e) 
        {
            newFilter();
        }

        @Override
        public void changedUpdate(DocumentEvent e) 
        {
            newFilter();
        }
    };
    docb.addDocumentListener(listenerb);

    for(int i=0;i<a.nextPosition;i++)
    {
        System.out.println(athTable.getModel().getValueAt(i,0));
    }

    firstPanel.add(myScrollTable);
}

private void newFilter()
{
    RowFilter rf = null;
    try 
    {
        List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2);
        filters.add(RowFilter.regexFilter("(?i)"+filterAthID.getText(), 0));
        filters.add(RowFilter.regexFilter("(?i)"+filterForeName.getText(), 1));
        rf = RowFilter.andFilter(filters);
    } 
    catch (java.util.regex.PatternSyntaxException e) 
    {
        return;
    }
    sorter.setRowFilter(rf);
}

问题是当我在filterAthIDfilterForeName中搜索某些内容,然后删除我正在搜索的行中的内容出现在代码中时.

The problem is when I search for something in filterAthID or filterForeName and then remove the contents that I was searching for blank rows appear in my code.

    sorter.setRowFilter
    (
        new RowFilter<TableModel, Integer>() 
            {
            @Override
            public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) 
                {
                    boolean included = true;
                    Object cellValue = entry.getModel().getValueAt(entry.getIdentifier(), 0);
                    if (cellValue == null || cellValue.toString().trim().isEmpty()) 
                    {
                        included = false;
                    }
                    return included;
                }
            }
    );

我已经使用此代码删除了所有空白行,但是在我清空搜索后,这似乎停止了工作.有人可以解决这个问题吗?

I had used this code to remove any blank rows but after I empty my search this seems to stop working. Could someone help with this issue?

推荐答案

为JTable合并两个行过滤器

Merging two row filters for a JTable

您可以将多个过滤器组合为一个.此示例使用和"过滤器,但您也可以使用或"过滤器:

You can combine multiple filters into one. This example uses an "and" fileter, but you can also use an "or" filter:

List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2);
filters.add(RowFilter.regexFilter(filterText.getText(), 0));
filters.add(RowFilter.regexFilter(filterText.getText(), 1));
rf = RowFilter.andFilter(filters);

此示例基于排序和过滤 Swing教程中的演示.

This example was based on the Sorting and Filtering demo from the Swing tutorial.

这篇关于合并JTable的两行过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆