【问题标题】:Java How to remove dates froma JTable that are after the specified date?Java如何从JTable中删除指定日期之后的日期?
【发布时间】:2020-12-20 14:38:00
【问题描述】:

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

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

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

【问题讨论】:

  • 感谢您的介绍。您的代码似乎回答了标题中的问题。你的问题是什么?创建minimal reproducible example 会帮助您,也会帮助我们帮助您。
  • 不要吞下异常。一个空的 catch 块是禁止的。你不会发现你的程序出了什么问题。这就像蒙着眼睛编码。
  • 也许你需要实现一个row filter
  • @Abra 没有行排序器只会删除具有特定字符串的特定行。

标签: java swing date simpledateformat


【解决方案1】:

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。

假设您将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 
}

【讨论】:

  • 谢谢。但这里的问题是删除包含 date1 ( defaulttablemodel.getvalueat( x , 1 ) )的行。有什么想法如何删除包含 date1 的鱼子。
  • @Snowrain - 我添加了更新。如有任何疑问/问题,请随时发表评论。
  • @Snowrain - 我希望解决方案解决了您的问题。如果是,您可以通过将答案标记为已接受来帮助社区。接受的答案有助于未来的访问者自信地使用该解决方案。如有任何疑问/问题,请随时发表评论。
【解决方案2】:

使用row filter

请注意,以下代码只是一个概念证明 (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 输入日期。单击过滤器 JButtonJTable 中仅显示早于或等于JSpinner 值的日期。请注意,代码不进行错误检查,例如用户可以输入他喜欢的任何日期。如果您输入的日期早于当前日期,则JTable 将不会显示任何内容,即它将为空。另请注意,我只对日期使用默认格式。您可以更改格式以满足您的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2012-12-16
    • 2016-11-28
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多