问题描述
有两个日期。一个在表列中,一个由用户输入。 我喜欢在用户输入日期之后的表格列中显示日期。
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。
假设您更正 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
}
,
使用 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
输入日期。单击过滤器 JSpinner
在 JButton
中仅显示早于或等于 JTable
值的那些日期。请注意,该代码不会进行错误检查,例如用户可以输入他喜欢的任何日期。如果您输入的日期早于当前日期,则 JSpinner
将不会显示任何内容,即它将为空。另请注意,我仅对日期使用默认格式。您可以更改格式以满足您的需要。