【问题标题】:JTable Date Filter not working the way it shouldJTable 日期过滤器无法正常工作
【发布时间】:2019-09-30 20:31:30
【问题描述】:

我为我的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;
    }

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 date 的方式:

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

它应该做的是在两个给定的日期 von (from) 和 bis (to) 之间进行过滤

【问题讨论】:

  • 为了获得更好的帮助,请尽快发布正确的minimal reproducible example 来证明您的问题。
  • 您没有将任何列传递给 dateFilter 方法。查看JavaDoc of the dateFilter method:最后一个参数应该是包含相关日期的列索引,如RowFilter.dateFilter(ComparisonType.AFTER, von, indexVonSpalteMitDatum)
  • g.getKeyCode() == KeyEvent.VK_ENTER 在很多方面都令人担忧
  • 没有给定索引意味着所有索引都被考虑在内,并且由于表格可以有无限长,我无法定义它

标签: java swing sorting jtable date-format


【解决方案1】:

我把这个例子放在一起,看起来效果很好。

一个主要区别是我通过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);
        }
    }
}

如果您仍然有问题,那么您应该提供Minimal, Complete, and Verifiable example

【讨论】:

  • 我发现我的问题是 JTable 不包含 Date 对象,而是一个字符串作为日期。我不能使用日期对象,因为它还显示我不想要的时间等。但是,RowFilter.datefilter 需要一个日期对象
  • 您可以使用 Date 对象,您可以使用 TableCellRenderer 根据需要对其进行格式化
  • 哦?没听说过 xD 会检查一下,谢谢
  • How to use tables; Using custom renderers。这是 Swing 中一个非常关键的概念
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 2019-08-05
  • 1970-01-01
  • 2013-09-15
  • 2020-03-07
  • 2015-02-14
  • 2013-08-16
相关资源
最近更新 更多