Java 如何从 JTable 中删除指定日期之后的日期?

问题描述

有两个日期。一个在表列中,一个用户输入。 我喜欢在用户输入日期之后的表格列中显示日期。

    for( int x = 0 ; x < defaulttablemodel.getRowCount() ; x ++ )
    if( ( date.after( new SimpleDateFormat( "dd/MM/yy" ).parse( 
    defaulttablemodel.getValueAt( x,1 ).toString() ) ) ) )
    {

     defaulttablemodel.removeRow( x );

    }

   }

   catch( Exception exception )
   {}

上面的代码给出了需要什么工作的想法。 谢谢。

解决方法

java.util 的日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API。出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7。

演示:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDate1 = "23/11/20";
        String strDate2 = "20/12/20";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/uu",Locale.ENGLISH);
        LocalDate date1 = LocalDate.parse(strDate1,dtf);
        LocalDate date2 = LocalDate.parse(strDate2,dtf);

        if (date2.isAfter(date1)) {
            System.out.println(date2 + " is after " + date1);
        }
    }
}

输出:

2020-12-20 is after 2020-11-23

Trail: Date Time 了解现代日期时间 API。

假设您更正 dateLocalDate 类型,您应该将代码更改为

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/uu",Locale.ENGLISH);
for(int x = 0; x < defaulttablemodel.getRowCount(); x++) {
    if(date.isAfter(LocalDate.parse(defaulttablemodel.getValueAt(x,1).toString()))) {
        defaulttablemodel.removeRow(x);
        //...Some code as per the requirement e.g. break; 
    }
    //...Some code as per the requirement 
}
,

使用 row filter

请注意,以下代码只是一个概念证明 (POC)。代码后的说明。

S_ReleaseChannelUpdate

import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JTable; import javax.swing.RowFilter; import javax.swing.RowFilter.ComparisonType; import javax.swing.SpinnerDateModel; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableRowSorter; public class FltrTabl implements Runnable,ActionListener { private static final String FILTER = "Filter"; private JFrame frame; private JSpinner dateSpinner; private JTable datesTable; private TableRowSorter<TablModl> sorter; @Override public void actionPerformed(ActionEvent event) { Object obj = dateSpinner.getValue(); if (obj instanceof Date) { Date theDate = (Date) obj; LocalDate ld = Instant.ofEpochMilli(theDate.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); RowFilter<TablModl,Object> rf = RowFilter.dateFilter(ComparisonType.BEFORE,theDate); sorter.setRowFilter(rf); } } @Override // java.lang.Runnable public void run() { showGui(); } private JPanel createFilterPanel() { JPanel filterPanel = new JPanel(); JLabel label = new JLabel("Not after"); filterPanel.add(label); SpinnerDateModel sdm = new SpinnerDateModel(); dateSpinner = new JSpinner(sdm); filterPanel.add(dateSpinner); JButton filterButton = new JButton(FILTER); filterButton.setMnemonic(KeyEvent.VK_F); filterButton.setToolTipText("Filter table."); filterButton.addActionListener(this); filterPanel.add(filterButton); return filterPanel; } private JScrollPane createTable() { TablModl model = new TablModl(); datesTable = new JTable(model); sorter = new TableRowSorter<TablModl>(model); datesTable.setRowSorter(sorter); JScrollPane scrollPane = new JScrollPane(datesTable); return scrollPane; } private void showGui() { frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(createFilterPanel(),BorderLayout.PAGE_START); frame.add(createTable(),BorderLayout.CENTER); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new FltrTabl()); } } class TablModl extends AbstractTableModel { private static final String[] COLUMNS = new String[]{"Date"}; Object[][] data; public TablModl() { LocalDate theDate = LocalDate.now(); LocalDate lastDate = theDate.plusDays(100); data = new Object[101][1]; int row = 0; while (!theDate.isAfter(lastDate)) { data[row++][0] = Date.from(theDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); theDate = theDate.plusDays(1); } } public String getColumnName(int column) { if (column == 0) { return COLUMNS[0]; } else { return super.getColumnName(column); } } @Override public int getRowCount() { return data.length; } @Override public int getColumnCount() { return COLUMNS.length; } @Override public Object getValueAt(int rowIndex,int columnIndex) { if (rowIndex >= 0 && rowIndex < getRowCount() && columnIndex >= 0 && columnIndex < getColumnCount()) { return data[rowIndex][columnIndex]; } return null; } } 仅显示从当前日期到未来 100 天的所有日期。用户使用 JTable 输入日期。单击过滤器 JSpinnerJButton 中仅显示早于或等于 JTable 值的那些日期。请注意,该代码不会进行错误检查,例如用户可以输入他喜欢的任何日期。如果您输入的日期早于当前日期,则 JSpinner 将不会显示任何内容,即它将为空。另请注意,我仅对日期使用默认格式。您可以更改格式以满足您的需要。