使用日历开始日期和结束日期填写jtable

时间:2014-01-03 03:15:24

标签: java swing date

开始日期是今天,结束日期应该是今天的日期+ 3年 例如:

TODAY=3.1.2013 and
END DATE=3.1.2016

这是截图

enter image description here     ;

    Date begindate = new Date();
    Calendar cal = Calendar.getInstance();
    cal.setTime(begindate);
    int today = cal.get(Calendar.DAY_OF_WEEK);
    cal.add(Calendar.YEAR, 3);
    Date enddate = cal.getTime();
    Date currentdate = begindate;
    while (true) {
        if (currentdate.getTime() >= enddate.getTime()) {
            break;
        } else {
        }
        Calendar c = Calendar.getInstance();
        c.setTime(begindate);
        c.add(Calendar.DATE, x++);
        Date newdate = c.getTime();
        int day = c.get(Calendar.DAY_OF_WEEK);
        currentdate = newdate;
    }

2 个答案:

答案 0 :(得分:4)

好的,不是试图预先计算每个Date,而是可以根据需要动态计算值...

我应该补充一点,这只是一种可能的方法......

基本上,使用开始日期和结束日期,您可以计算它们之间的天数,计算您需要的行数,然后在需要时根据日期从日历开始计算Date当前行和列。

以下示例使用Joda Time执行许多日期计算,因为它比构建Calendar(IMHO)中的Java更可靠,更易于使用

Start End

import java.awt.EventQueue;
import java.text.NumberFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.MutableDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class BuildCalendar {

    public static void main(String[] args) {
        new BuildCalendar();
    }

    public BuildCalendar() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DateTimeFormatter dtf = DateTimeFormat.forPattern("MM.dd.yyyy");
                DateTime startDate = dtf.parseDateTime("3.1.2013");
                DateTime endDate = dtf.parseDateTime("3.1.2016");

                JTable table = new JTable(new CalendarModel(startDate, endDate));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class CalendarModel extends AbstractTableModel {

        public static String[] COLUMN_NAMES = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

        private int rows = 0;

        private MutableDateTime startOfWeek;
        private DateTime startDate;
        private DateTime endDate;

        public CalendarModel(DateTime startDate, DateTime endDate) {
            this.startDate = startDate;
            this.endDate = endDate;

            int days = Days.daysBetween(startDate, endDate).getDays();
            if (days > 0) {

                startOfWeek = new MutableDateTime(startDate);
                while (startOfWeek.getDayOfWeek() != DateTimeConstants.SUNDAY) {

                    startOfWeek.addDays(-1);

                }

                int offset = Days.daysBetween(startOfWeek, startDate).getDays();
                days += offset;

                System.out.println(NumberFormat.getNumberInstance().format(days / 7d));
                rows = (int) Math.round(days / 7d) + 1;
                System.out.println(rows);

            }
        }

        @Override
        public int getRowCount() {
            return rows;
        }

        @Override
        public int getColumnCount() {
            return 7;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return Date.class;
        }

        @Override
        public String getColumnName(int column) {
            return COLUMN_NAMES[column];
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {

            Date date = null;

            if (startOfWeek != null) {

                MutableDateTime dt = new MutableDateTime(startOfWeek);
                int day = (rowIndex * 7) + columnIndex;
                dt.addDays(day);

                if (dt.isBefore(startDate) || dt.isAfter(endDate)) {

                    date = null;

                } else {

                    date = dt.toDate();

                }

            }

            return date;

        }

    }

}

已更新为Calendar示例

import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;

public class BuildCalendar {

    public static void main(String[] args) {
        new BuildCalendar();
    }

    public BuildCalendar() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                try {
                    SimpleDateFormat sdf = new SimpleDateFormat("MM.dd.yyyy");
                    Date startDate = sdf.parse("3.1.2013");
                    Date endDate = sdf.parse("3.1.2016");

                    JTable table = new JTable(new CalendarModel(startDate, endDate));

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new JScrollPane(table));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (ParseException | HeadlessException exp) {
                    exp.printStackTrace();
                }
            }
        });
    }

    public static class CalendarModel extends AbstractTableModel {

        public static String[] COLUMN_NAMES = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

        private int rows = 0;

        private Date startOfWeek;
        private Date startDate;
        private Date endDate;

        public CalendarModel(Date startDate, Date endDate) {

            this.startDate = startDate;
            this.endDate = endDate;

            Calendar cal = Calendar.getInstance();
            cal.setTime(startDate);
            while (cal.getTime().before(endDate)) {
                cal.add(Calendar.DATE, 7);
                rows++;
            }
            rows++;

            if (rows > 0) {

                int offset = 0;
                cal.setTime(startDate);
                while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {

                    cal.add(Calendar.DATE, -1);
                    offset++;

                }

                startOfWeek = cal.getTime();
                System.out.println("Start @ " + cal.getTime());
                System.out.println("rows = " + rows);

            }
        }

        @Override
        public int getRowCount() {
            return rows;
        }

        @Override
        public int getColumnCount() {
            return 7;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return Date.class;
        }

        @Override
        public String getColumnName(int column) {
            return COLUMN_NAMES[column];
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {

            Date date = null;

            if (startOfWeek != null) {

                Calendar cal = Calendar.getInstance();
                cal.setTime(startOfWeek);
                int day = (rowIndex * 7) + columnIndex;
                System.out.println("day = " + day);
                cal.add(Calendar.DATE, day);

                if (cal.getTime().before(startDate) || cal.getTime().after(endDate)) {

                    date = null;

                } else {

                    date = cal.getTime();
                    System.out.println("Real date = " + date);

                }

            }

            return date;

        }

    }

}

答案 1 :(得分:0)

使用JTable(Object[][] rowData, Object[] columnNames)构造函数。 为了构建rowData,首先要创建一个星期几和日期的地图:

    Map<Integer, List<Date>> dateMap = new HashMap<Integer, List<Date>>();
    //Initialize
    for (int i = Calendar.SUNDAY; i <= Calendar.SATURDAY; ++i) {
        dateMap.put(i, new ArrayList<Date>());
    }

在循环中,向地图添加值:

dateMap.get(day).add(currentdate);

在构建JTable之前,请将dateMap转换为Object[][]