java如何从jtable中删除指定日期之后的日期?

tcomlyy6  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(347)

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

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 )
   {}

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

bf1o4zei

bf1o4zei1#

api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
演示:

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。
假设你是对的 date 属于 LocalDate ,您应该将代码更改为

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 
}
mpbci0fu

mpbci0fu2#

使用行筛选器。
请注意,下面的代码只是一个概念证明(poc)。代码后面的解释。

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;
    }
}

这个 JTable 仅显示从当前日期到未来100天的所有日期。用户使用 JSpinner . 单击过滤器 JButton 显示,在 JTable ,只有那些早于或等于 JSpinner 价值观。注意,代码没有错误检查,例如用户可以输入任何他喜欢的日期。如果输入的日期早于当前日期,则 JTable 不会显示任何内容,即它将为空。还要注意的是,我只对日期使用默认格式。您可以更改格式以满足您的需要。

相关问题