鱼C论坛

 找回密码
 立即注册
查看: 2738|回复: 2

编写一个日历程序,用户通过下拉列表输入年份、月份,界面上显示这个月的日历,包...

[复制链接]
发表于 2019-12-18 16:32:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
图形用户界面这一块的知识,刚刚学这一部分 ,希望有朋友写一下怎么实现的,讲的稍微详细一点,我本人的想法是上边添加组合框,下边添加网格布局器,但是不会用相关的函数,查了之后脑子乱成一堆 ,提前谢谢各位网友了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-18 16:32:47 | 显示全部楼层
我怕显示问题,再写一遍题目   编写一个日历程序,用户通过下拉列表输入年份、月份,界面上显示这个月的日历,包括星期的7天的标题,以及顶部的月标题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-2 11:16:27 | 显示全部楼层
这个是我在做练习的时候在网上找到的,楼主课自行研究下。

  1. import java.awt.BorderLayout;
  2. import java.awt.Color;
  3. import java.awt.Dimension;
  4. import java.awt.FlowLayout;
  5. import java.awt.GridLayout;
  6. import java.awt.Image;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.ItemEvent;
  10. import java.awt.event.ItemListener;
  11. import java.awt.event.WindowAdapter;
  12. import java.awt.event.WindowEvent;
  13. import java.util.Calendar;
  14. import java.util.Date;

  15. import javax.swing.BorderFactory;
  16. import javax.swing.ButtonGroup;
  17. import javax.swing.ImageIcon;
  18. import javax.swing.JButton;
  19. import javax.swing.JComboBox;
  20. import javax.swing.JDialog;
  21. import javax.swing.JLabel;
  22. import javax.swing.JPanel;
  23. import javax.swing.JTextField;
  24. import javax.swing.JToggleButton;
  25. import javax.swing.SwingConstants;
  26. import javax.swing.border.Border;
  27. import javax.swing.plaf.ButtonUI;
  28. import javax.swing.plaf.ComboBoxUI;

  29. public class DateField extends JPanel
  30. {
  31.         private JTextField tfDate;
  32.         private JButton button;
  33.         private JDialog dlg;
  34.         private JPanel paCalendar;
  35.         private boolean show;
  36.         private JComboBox cboYear;
  37.         private JComboBox cboMonth;
  38.         private JLabel[] lbls = new JLabel[7];
  39.         private JToggleButton[] toggles = new JToggleButton[42];
  40.         private Border border;
  41.         private Color bgColor;
  42.         private int width = 200, height = 30;
  43.         private int year;
  44.         private int month;
  45.         private int date;
  46.         private int dayOfWeek;
  47.         private String[] week = { "日", "一", "二", "三", "四", "五", "六" };

  48.         public DateField()
  49.         {                //从系统中获得当前日期
  50.                 year = Calendar.getInstance().get(Calendar.YEAR);
  51.                 month = Calendar.getInstance().get(Calendar.MONTH) + 1;
  52.                 date = Calendar.getInstance().get(Calendar.DATE);
  53.                 dayOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
  54.                 initUI();        //界面制作
  55.                 initDateDialog();
  56.                 updateField();        //更新日期
  57.         }

  58.         private void initUI()
  59.         {       
  60.                 tfDate = new JTextField();
  61.                 tfDate.setEditable(false);
  62.                 tfDate.setBackground(Color.WHITE);        //背景颜色
  63.                 border = tfDate.getBorder();
  64.                 tfDate.setBorder(null);        //布局模式为无布局

  65.                 button = new JButton();       
  66.                 button.setPreferredSize(new Dimension(height, height));        //设定按钮的大小
  67.                 button.addActionListener(new ActionListener()                //监听按钮的选项
  68.                 {
  69.                         public void actionPerformed(ActionEvent e)
  70.                         {
  71.                                 if (show == false)
  72.                                 {
  73.                                         dlg.setLocation(DateField.this.getLocationOnScreen().x, DateField.this.getLocationOnScreen().y + DateField.this.height);        //获得选择选择选项栏的横纵坐标
  74.                                         dlg.setAlwaysOnTop(true);
  75.                                         dlg.setVisible(true);        //使得窗口可见
  76.                                 } else
  77.                                 {
  78.                                         dlg.dispose();
  79.                                 }
  80.                                 updateField();
  81.                                 show = !show;
  82.                         }
  83.                 });

  84.                 this.bgColor = this.getBackground();        //应用背景颜色

  85.                 this.setOpaque(false);
  86.                 this.setLayout(new BorderLayout(0, 0));
  87.                 this.setBorder(border);
  88.                 this.add(tfDate, BorderLayout.CENTER);        //边布局中央
  89.                 this.add(button, BorderLayout.EAST);        //边布局西方
  90.         }

  91.         private void initDateDialog()
  92.         {
  93.                 dlg = new JDialog();
  94.                 dlg.setUndecorated(true);
  95.                 paCalendar = new JPanel(new BorderLayout());
  96.                 paCalendar.setBorder(this.border);
  97.                 paCalendar.setBackground(this.bgColor);

  98.                 int borderWidth = 3;
  99.                 // 初始化两个下拉组件用于年和月的选择
  100.                 JPanel paHeader = new JPanel(new GridLayout(1, 2, borderWidth, borderWidth));        //表格布局设置位置
  101.                 paHeader.setOpaque(false);
  102.                 paHeader.setPreferredSize(new Dimension(this.width, this.height + borderWidth));
  103.                 paHeader.setBorder(BorderFactory.createEmptyBorder(borderWidth, borderWidth, borderWidth, borderWidth));
  104.                 paHeader.add(cboYear = new JComboBox());        //将选择年度的下拉表格放入头部       
  105.                 paHeader.add(cboMonth = new JComboBox());        //将选择的月度下拉表格放入头部
  106.                 initYearModel();        //调用年度的方法
  107.                 initMonthModel();                //调用月度的方法
  108.                 paCalendar.add(paHeader, BorderLayout.NORTH);

  109.                 // 初始化日期组件
  110.                 JPanel paDay = new JPanel();
  111.                 paDay.setOpaque(false);
  112.                 paDay.setPreferredSize(new Dimension(this.height * 7, this.height * 7));
  113.                 initDate(paDay);
  114.                 paCalendar.add(paDay, BorderLayout.CENTER);

  115.                 dlg.setContentPane(paCalendar);
  116.                 dlg.pack();
  117.                 dlg.addWindowFocusListener(new WindowAdapter()
  118.                 {
  119.                         public void windowLostFocus(WindowEvent e)
  120.                         {
  121.                                 dlg.dispose();
  122.                         }
  123.                 });
  124.         }

  125.         private void initYearModel()
  126.         {
  127.                 for (int y = 1970; y < 2033; y++)
  128.                         cboYear.addItem(y);
  129.                 cboYear.setSelectedItem(year);
  130.                 cboYear.addItemListener(new ItemListener()
  131.                 {
  132.                         public void itemStateChanged(ItemEvent e)
  133.                         {
  134.                                 year = Integer.parseInt(cboYear.getSelectedItem().toString());
  135.                                 updateComponent();
  136.                         }

  137.                 });
  138.         }

  139.         private void initMonthModel()        //循环制作出1~12月度菜单栏
  140.         {
  141.                 for (int m = 1; m <= 12; m++)
  142.                         cboMonth.addItem(m);                //将菜单栏放入下拉菜单
  143.                 cboMonth.setSelectedItem(month);               
  144.                 cboMonth.addItemListener(new ItemListener()
  145.                 {

  146.                         public void itemStateChanged(ItemEvent e)                //定义开始的月度日志
  147.                         {
  148.                                 month = Integer.parseInt(cboMonth.getSelectedItem().toString());                //多的开始时的月度信息
  149.                                 updateComponent();                //更新数据的方法
  150.                         }       
  151.                 });
  152.         }

  153.         private void initDate(JPanel pa)
  154.         {
  155.                 pa.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));        //流布局显示在画面中间
  156.                 // 显示日历的标签栏
  157.                 for (int i = 0; i < week.length; i++)
  158.                 {
  159.                         lbls[i] = new JLabel(week[i]);
  160.                         lbls[i].setHorizontalAlignment(SwingConstants.CENTER);
  161.                         lbls[i].setOpaque(true);
  162.                         lbls[i].setBackground(Color.WHITE);
  163.                         lbls[i].setPreferredSize(new Dimension(this.height, this.height));
  164.                         pa.add(lbls[i]);
  165.                 }
  166.                 // 加载日历按钮
  167.                 ButtonGroup group = new ButtonGroup();
  168.                 for (int i = 0; i < 42; i++)
  169.                 {
  170.                         toggles[i] = new JToggleButton();
  171.                         toggles[i].setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
  172.                         toggles[i].setPreferredSize(new Dimension(this.height, this.height));
  173.                         toggles[i].addActionListener(new ActionListener()
  174.                         {
  175.                                 public void actionPerformed(ActionEvent e)
  176.                                 {
  177.                                         date = Integer.parseInt(((JToggleButton) e.getSource()).getText().toString());
  178.                                         dlg.dispose();
  179.                                         updateField();
  180.                                 }
  181.                         });
  182.                         group.add(toggles[i]);
  183.                         pa.add(toggles[i]);
  184.                 }
  185.                 updateComponent();
  186.         }

  187.         private void updateComponent()
  188.         {
  189.                 if (cboYear == null || cboMonth == null)
  190.                         return;
  191.                 Calendar cal = Calendar.getInstance();
  192.                 cal.set(year, month - 1, 1);
  193.                 // 根据当月的第一天是星期几来判断日历按钮的数字该从第几个按钮开始显示
  194.                 int off = cal.get(Calendar.DAY_OF_WEEK) - 1;
  195.                 // 计算当月总共有几天
  196.                 int end = 30;
  197.                 if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
  198.                         end = 31;
  199.                 if (month == 2)
  200.                 {
  201.                         if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  202.                                 end = 29;
  203.                         else
  204.                                 end = 28;
  205.                 }
  206.                 for (int i = 0; i < 42; i++)
  207.                 {
  208.                         if (i >= off && i <= end + off - 1)
  209.                         {
  210.                                 int day = i - off + 1;
  211.                                 toggles[i].setText(day + "");
  212.                                 toggles[i].setEnabled(true);
  213.                         } else
  214.                         {
  215.                                 toggles[i].setText("");
  216.                                 toggles[i].setEnabled(false);
  217.                         }
  218.                 }
  219.                 // 使当天的按钮呈现被按下的效果
  220.                 int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + off - 1;
  221.                 toggles[day].setSelected(true);
  222.         }

  223.         // 更新文本框内的文字
  224.         private void updateField()
  225.         {
  226.                 StringBuilder builder = new StringBuilder();
  227.                 builder.append(this.year + "年");
  228.                 builder.append(this.month + "月");
  229.                 builder.append(this.date + "日");
  230.                 Calendar cal = Calendar.getInstance();
  231.                 cal.set(this.year, this.month - 1, this.date);
  232.                 builder.append(" 星期" + week[cal.get(Calendar.DAY_OF_WEEK) - 1]);
  233.                 tfDate.setText(builder.toString());
  234.         }


  235.         public Dimension getPreferredSize()
  236.         {
  237.                 return new Dimension(this.width, this.height);
  238.         }

  239.         public void setPreferredSize(Dimension preferredSize)
  240.         {
  241.                 super.setPreferredSize(preferredSize);
  242.                 this.width = (int) preferredSize.getWidth();
  243.                 this.height = (int) preferredSize.getHeight();
  244.         }

  245.         public void setBackground(Color bg)
  246.         {
  247.                 super.setBackground(bg);
  248.                 this.bgColor = bg;
  249.         }

  250.         public void setBorder(Border border)
  251.         {
  252.                 super.setBorder(border);
  253.                 if (paCalendar != null)
  254.                         paCalendar.setBorder(border);
  255.         }

  256.         public void setButtonUI(String clzUIName)
  257.         {
  258.                 try
  259.                 {
  260.                         button.setUI((ButtonUI) Class.forName(clzUIName).newInstance());
  261.                 }
  262.                 catch (InstantiationException | IllegalAccessException | ClassNotFoundException e)
  263.                 {
  264.                         e.printStackTrace();
  265.                 }
  266.         }

  267.         public void setDateButtonUI(String clzUIName)
  268.         {
  269.                 try
  270.                 {
  271.                         for (int i = 0; i < 42; i++)
  272.                                 toggles[i].setUI((ButtonUI) Class.forName(clzUIName).newInstance());
  273.                 }
  274.                 catch (InstantiationException | IllegalAccessException | ClassNotFoundException e)
  275.                 {
  276.                         // TODO Auto-generated catch block
  277.                         e.printStackTrace();
  278.                 }
  279.         }

  280.         public void setComboBoxUI(String clzUIName)
  281.         {
  282.                 try
  283.                 {
  284.                         cboYear.setUI((ComboBoxUI) Class.forName(clzUIName).newInstance());
  285.                         cboMonth.setUI((ComboBoxUI) Class.forName(clzUIName).newInstance());
  286.                 }
  287.                 catch (InstantiationException | IllegalAccessException | ClassNotFoundException e)
  288.                 {
  289.                         e.printStackTrace();
  290.                 }

  291.         }

  292.         public void setLableColor(Color fg, Color bg)
  293.         {
  294.                 for (int i = 0; i < lbls.length; i++)
  295.                 {
  296.                         lbls[i].setForeground(fg);
  297.                         lbls[i].setBackground(bg);
  298.                 }
  299.         }

  300.         public void setIcon(Image icon)
  301.         {
  302.                 button.setIcon(new ImageIcon(icon));
  303.         }

  304.         public int getYear()
  305.         {
  306.                 return this.year;
  307.         }

  308.         public int getMonth()
  309.         {
  310.                 return this.month;
  311.         }

  312.         public int getDateOfWeek()
  313.         {
  314.                 return this.date;
  315.         }

  316.         public Date getDate()
  317.         {
  318.                 Calendar cal = Calendar.getInstance();
  319.                 cal.set(this.year, (this.month-1), this.date);
  320.                 return cal.getTime();
  321.         }
  322. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 12:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表