zoukankan      html  css  js  c++  java
  • 用JTable 实现日历

    效果图:

     主要思想:日历最核心的功能就是能显示某年某月对应的日期和星期几。因此只要实现传入具体的年份和月份,得到一组存放了日期的数组a[ ]即可。其中数组的大小设置成42,要考虑的问题是当月的第一天对应星期几。日期数组中的前七个,肯定包含了当月的第一天,把这一天找到,将“1”填入,后面的日期依次累加直到加完该月最后一天为止。

    MyCalendar类:得到用于显示日期数组a[ ]

    import java.util.Calendar;
    
    public class MyCalendar {
    String day[];
    int year = 2020,month=0;
    
    public String[] getDay() {
    return day;
    }
    public void setDay(String[] day) {
    this.day = day;
    }
    public int getYear() {
    return year;
    }
    public void setYear(int year) {
    this.year = year;
    }
    public int getMonth() {
    return month;
    }
    public void setMonth(int month) {
    this.month = month;
    }
    private boolean isLeapYear() {
    if(this.year%4==0 && this.year%100!=0){
    return true;
    }else 
    if(this.year%400==0){
    return true;
    }else
    
    return false;
    }
    
    
    //获得显示数组
    public String[] getCalendar(){
    Calendar calendar=Calendar.getInstance();
    String a[]=new String[42];
    calendar.set(year,month-1,1);
    int weekday=calendar.get(Calendar.DAY_OF_WEEK)-1;
    int day=0;
    int days = 31;
    if (this.month == 4 || this.month == 6 || this.month == 9 || this.month == 11)
    days = 30;
    if (this.month == 2 && isLeapYear())
    days = 29;
    if (this.month == 2 && !isLeapYear())
    days = 28;
    
    for(int i = weekday,n=1;i< weekday +days;i++){
    a[i]=String.valueOf(n);
    n++;
    }
    return a;
    }
    
    }

    MyFrame类:创造显示面板,主要用到JTable。

    public class MyFrame extends JFrame implements ActionListener {
    //存储数据
    MyCalendar calendar = new MyCalendar();
    JComboBox choiceYear,choiceMonth;
    JTable table = null;
    JPanel root = new JPanel();
    JLabel lyear, lmonth;
    
    private Object[] name = {"日","一","二","三","四","五","六"};
    private TableModel tableModel = new DefaultTableModel(name,6);
    
    //    private static int row = 6;
    //    private static int column = 7;
    
    public MyFrame(String title) {
    super(title);
    
    
    this.setContentPane(root);
    root.setLayout(new BorderLayout());
    //年月选择栏
    choiceYear=new JComboBox();
    choiceMonth=new JComboBox();
    lyear=new JLabel("年");
    lmonth=new JLabel("月 ");
    for(int i=1990;i<2050;i++)
    choiceYear.addItem(i);
    choiceYear.addActionListener(this);
    for(int i=1;i<=12;i++)
    choiceMonth.addItem(i);
    choiceMonth.addActionListener(this);
    
    JPanel pNorth=new JPanel();
    
    pNorth.add(choiceYear);
    pNorth.add(lyear);
    pNorth.add(choiceMonth);
    pNorth.add(lmonth);
    root.add(pNorth,BorderLayout.NORTH);
    
    // 表格初始化
    setYearAndMonth( 1990, 1);
    
    
    
    }
    
    //设置年月日
    public void setYearAndMonth(int y,int m){
    calendar.setYear(y);
    calendar.setMonth(m);
    String day[]=calendar.getCalendar();
    Vector<Object> rowData = new Vector<>();
    int row = 0;
    int column = 0;
    for(int i = 0; i< 42; i++) {
    row = i / 7;
    column = i % 7;
    
    tableModel.setValueAt(day[i], row, column);
    
    }
    
    
    // 创建 JTable,直接重写 isCellEditable(),设为不可编辑
    table = new JTable(tableModel){
    @Override
    public boolean isCellEditable(int row, int column)
    {
    return false;
    }    
    };
    JScrollPane scrollPane = new JScrollPane(table);
    root.add(scrollPane, BorderLayout.CENTER);
    
    // 添加到主界面    
    table.setFillsViewportHeight(true);    
    table.setRowSelectionAllowed(true); // 整行选择
    table.setRowHeight(30);    
    }
     
    
    public void actionPerformed(ActionEvent e){
    
    //选择年份
    if (e.getSource()==choiceYear){
    calendar.setYear((Integer) choiceYear.getSelectedItem());
    String day[]=calendar.getCalendar();
    Vector<Object> rowData = new Vector<>();
    int row = 0;
    int column = 0;
    for(int i = 0; i< 42; i++) {
    row = i / 7;
    column = i % 7;
    
    tableModel.setValueAt(day[i], row, column);
    
    }
    table = new JTable(tableModel){
    @Override
    public boolean isCellEditable(int row, int column)
    {
    return false;
    }    
    };
    JScrollPane scrollPane = new JScrollPane(table);
    root.add(scrollPane, BorderLayout.CENTER);
    
    // 添加到主界面    
    table.setFillsViewportHeight(true);    
    table.setRowSelectionAllowed(true); // 整行选择
    table.setRowHeight(30);    
    }
    //选择月份
    else if (e.getSource()==choiceMonth){
    calendar.setMonth((Integer) choiceMonth.getSelectedItem());
    String day[]=calendar.getCalendar();
    Vector<Object> rowData = new Vector<>();
    int row = 0;
    int column = 0;
    for(int i = 0; i< 42; i++) {
    row = i / 7;
    column = i % 7;
    
    tableModel.setValueAt(day[i], row, column);
    
    }
    }
    table = new JTable(tableModel){
    @Override
    public boolean isCellEditable(int row, int column)
    {
    return false;
    }    
    };
    JScrollPane scrollPane = new JScrollPane(table);
    root.add(scrollPane, BorderLayout.CENTER);
    
    // 添加到主界面    
    table.setFillsViewportHeight(true);    
    table.setRowSelectionAllowed(true); // 整行选择
    table.setRowHeight(30);    
    
    }
    
    
    }

    ShowView类:用于显示窗口,照抄即可,无需理解。

    import java.awt.Container;
    import java.awt.FlowLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class ShowView
    {
        private static void createGUI()
        {
            
            // 语法:因为MyFrame是JFrame的子类,所以可以这么写
            JFrame frame = new MyFrame("日历");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            
            // 设置窗口的其他参数,如窗口大小
            frame.setSize(400, 300);
            
            // 显示窗口
            frame.setVisible(true);
            
            
        }
        
        public static void main(String[] args)
        {
            // 此段代码间接地调用了 createGUI()
            
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run()
                {
                    createGUI();
                }
            });
    
        }
    }
  • 相关阅读:
    网游内存数据库的设计(1)
    基于用户级线程的远程调用效率测试
    实现c协程
    KendyNet for linux
    开源一个lua的网络库
    C语言重写网络发送/接收封包
    C协程使用举例
    各种内存分配器的对比测试
    KendyNet性能测试
    C协程实现的效率对比
  • 原文地址:https://www.cnblogs.com/qianji-7/p/13759500.html
Copyright © 2011-2022 走看看