Фильтр даты JTable работает не так, как должен - PullRequest
0 голосов
/ 14 мая 2019

Я сделал фильтр даты для своего JTable, однако, как только я щелкну на фильтре после того, как предоставлю фильтру дату и дату, все записи в моей таблице исчезнут.Я предполагаю, что формат даты не подходит

public void filterDates(Date von, Date bis) {
    System.out.println(von);
    System.out.println(bis);
    List<RowFilter<Object, Object>> filters = new ArrayList<RowFilter<Object, Object>>(2);
    filters.add(RowFilter.dateFilter(ComparisonType.AFTER, von));
    filters.add(RowFilter.dateFilter(ComparisonType.BEFORE, bis));
    TableRowSorter<DefaultTableModel> tr2 = new TableRowSorter<DefaultTableModel>(
            (DefaultTableModel) table.getModel());
    table.setRowSorter(tr2);
    tr2.setRowFilter(RowFilter.andFilter(filters));
}

Два других метода, используемых для ввода метода filterDates:

private Date von() {
    String sVon = txtVon.getText();
    SimpleDateFormat f1 = new SimpleDateFormat("dd.MM.yy");
    Date dVon = new Date();
    try {
        dVon = (Date) f1.parse(sVon);
        System.out.println(dVon);
        return dVon;
    } catch (ParseException e) {
        e.printStackTrace();
        return dVon;
    }

AND

private Date bis() {
    String sBis = txtBis.getText();
    SimpleDateFormat f1 = new SimpleDateFormat("dd.MM.yy");
    Date dBis = new Date();
      try {
        dBis = (Date) f1.parse(sBis);
        System.out.println(dBis);
        return dBis;
    } catch (ParseException e) {
        e.printStackTrace();
        return dBis;
    }
}

И вот как метод from и to передается методу фильтра:

if (g.getKeyCode() == KeyEvent.VK_ENTER) {
                ed.filterDates(von(), bis());

Что он должен сделать, это отфильтровать две заданные даты von (from) и bis (to)

1 Ответ

1 голос
/ 14 мая 2019

Я скомбинировал этот пример, который, кажется, работает нормально.

Одно существенное отличие состоит в том, что я сдаю indices для проверки ...

filters.add(RowFilter.dateFilter(ComparisonType.AFTER, von, 2));

В этом примере это номер столбца 3

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Month;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.RowFilter.ComparisonType;
import javax.swing.RowSorter;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TestTableSorter {

    public static void main(String[] args) {
        new TestTableSorter();
    }

    public TestTableSorter() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                try {
                    SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
                    final JTable table = new JTable();
                    DefaultTableModel model = new DefaultTableModel(
                            new Object[][]{
                                {"A", 1, sdf.parse("12/05/2000")},
                                {"B", 2, sdf.parse("12/06/2000")},
                                {"C", 3, sdf.parse("12/07/2000")},
                                {"D", 4, sdf.parse("12/08/2000")},
                                {"E", 5, sdf.parse("12/09/2000")},
                                {"F", 1, sdf.parse("12/10/2000")},
                                {"G", 2, sdf.parse("12/11/2000")},
                                {"H", 3, sdf.parse("12/12/2000")},
                                {"I", 4, sdf.parse("12/01/1990")},
                                {"J", 5, sdf.parse("12/02/1990")},
                                {"K", 1, sdf.parse("12/03/1990")},
                                {"L", 2, sdf.parse("12/04/1995")},
                                {"M", 3, sdf.parse("12/05/1995")},
                                {"N", 4, sdf.parse("12/06/1995")},
                                {"O", 5, sdf.parse("12/07/1995")},
                                {"P", 1, sdf.parse("12/08/1980")},
                                {"Q", 2, sdf.parse("12/09/1980")},
                                {"R", 3, sdf.parse("12/10/1980")},
                                {"S", 4, sdf.parse("12/11/1980")},
                                {"T", 5, sdf.parse("12/12/1980")},
                                {"U", 1, sdf.parse("12/01/1985")},
                                {"V", 2, sdf.parse("12/02/1985")},
                                {"W", 3, sdf.parse("12/03/1985")},
                                {"X", 4, sdf.parse("12/04/1985")},
                                {"Y", 5, sdf.parse("12/05/1985")},
                                {"Z", 1, sdf.parse("12/06/1985")},},
                            new Object[]{"Name", "Number", "Date"});

                    table.setModel(model);
                    table.setAutoCreateRowSorter(true);

                    JPanel panel = new JPanel(new GridLayout(1, 3));
                    panel.add(createButton(table));

                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(panel, BorderLayout.NORTH);
                    frame.add(new JScrollPane(table));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (Exception exp) {
                    exp.printStackTrace();
                }
            }

            protected JButton createButton(JTable table) {
                JButton btn = new JButton("Filter");
                btn.addActionListener(new FilterAction(table));
                return btn;
            }

        });
    }

    public class FilterAction implements ActionListener {

        private JTable table;

        public FilterAction(JTable table) {
            this.table = table;
        }

        public RowSorter<? extends TableModel> filterDates(Date von, Date bis) {
            List<RowFilter<Object, Object>> filters = new ArrayList<>(2);
            filters.add(RowFilter.dateFilter(ComparisonType.AFTER, von, 2));
            filters.add(RowFilter.dateFilter(ComparisonType.BEFORE, bis, 2));
            TableRowSorter<DefaultTableModel> tr2 = new TableRowSorter<>((DefaultTableModel) table.getModel());
            tr2.setRowFilter(RowFilter.andFilter(filters));
            return tr2;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            LocalDate localFrom = LocalDate.of(1995, Month.JANUARY, 1);
            LocalDate localTo = LocalDate.of(2000, Month.AUGUST, 1);

            Date from = Date.from(localFrom.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
            Date to = Date.from(localTo.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

            RowSorter<? extends TableModel> rowSorter = filterDates(from, to);
            table.setRowSorter(rowSorter);
        }
    }
}

Если у вас все еще есть проблемы, вы должны предоставить Минимальный, Полный и Проверяемый пример

...