实现一个简单的日历

利用Java写一个简易的日历

 

//构造窗体中的内容 package practice; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.util.Calendar; import javax.swing.JPanel; public class myPanel extends JPanel{ public myPanel() { } @Override protected void paintComponent(Graphics g) { int width = this.getWidth(); int height = this.getHeight(); Graphics2D g2d = (Graphics2D) g; //平滑绘制反锯齿 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//设置一个单独的渲染算法 g2d.setPaint(Color.white); g2d.fillRect(0, 0, width, height); int x = 0; int y = 0; int x_size = 100;//单元格宽度 int y_size = 80;//单元格高度 //第一行,显示一二三四五六日 g2d.setPaint(Color.GRAY); g2d.drawLine(x, y,x + x_size * 7, y); g2d.drawLine(x, y+y_size, x_size*7, y+y_size); String [] cc = {"一","二","三","四","五","六","日"}; g2d.setPaint(Color.GRAY); g2d.setFont(new Font("宋体",0,20)); for(int i = 0; i < 7;i++) { Rectangle rect =new Rectangle(x+i*x_size, y, x_size, y_size); drawText(g2d,cc[i],rect); } //计算本月第一天是星期几 Calendar cal = Calendar.getInstance(); int theYear = cal.get(Calendar.YEAR); int theMonth = cal.get(Calendar.MONTH);//当前月份 int theDay = cal.get(Calendar.DAY_OF_MONTH);//当前几号 cal.set(Calendar.DAY_OF_MONTH, 1);//向前推到本月第一号 int weekday = cal.get(Calendar.DAY_OF_WEEK);//计算本月第一天是星期几 System.out.println("week:"+weekday); // //第几周转换为英文 String weekDay = null ; switch(weekday) { case 1: weekDay = "monday" ; break; case 2: weekDay = "tuesday" ; break; case 3: weekDay = "wednesday" ; break; case 4: weekDay = "thursday" ; break; case 5: weekDay = "friday" ; break; case 6: weekDay = "saturdy" ; break; case 7: weekDay = "sunday" ; break; default: break; } System.out.println("today is " + theYear +"/" + theMonth + "/" + theDay ); System.out.println("and today is " + weekDay); //往前推N天 //Calendar里规定Sunday是第一天, //他是周一,前推0天,周二推一天,周五推4天,周日推6天 int start = weekday - Calendar.MONDAY; if(start < 0) start = 6; cal.add(Calendar.DAY_OF_MONTH, 0 - start); //绘制五行 //每月最多31天,分五行显示 x = 0; y += y_size; for(int i = 0;i < 6 ;i++)//6行 { for(int j = 0;j < 7;j++)//7列 { //判断月份是否相同 if(cal.get(Calendar.MONTH) == theMonth) { g2d.setPaint(Color.BLACK); } else { g2d.setPaint(Color.GRAY); } int day = cal.get(Calendar.DAY_OF_MONTH); Rectangle rect = new Rectangle(x+x_size*j,y+y_size*i,x_size,y_size); drawText(g2d,String.valueOf(day),rect); //日期加一 cal.add(Calendar.DAY_OF_MONTH, 1); } } } //将str绘制在矩形rent中,居中显示 private void drawText(Graphics2D g2d, String str, Rectangle rect) { FontMetrics fm = g2d.getFontMetrics(); int fontSize = fm.getHeight();//字高 int textWidth = fm.stringWidth(str);//获取字宽 int leading = fm.getLeading(); int ascent = fm.getAscent(); int descent = fm.getDescent(); System.out.println(fontSize + "," + leading + "," + ascent + "," + descent ); int x = 0; int y = 0; x = rect.x + (rect.width - textWidth)/2;//水平居中 y = rect.y + rect.height / 2 + (fontSize -leading)/2 -descent; g2d.drawString(str, x, y); } }
//创建按钮 package practice; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import javax.swing.*; import javax.swing.border.Border; public class myFrame extends JFrame{ myPanel p = new myPanel(); public myFrame(String title) { super(title); Container root = this.getContentPane();//创建一个容器 root.setLayout(new BorderLayout());//定义布局方式 root.add(p,BorderLayout.CENTER);//将对象p放置在中间 //设置边框 Border border = BorderFactory.createLineBorder(Color.BLUE,2,true);//用蓝色绘制一个行边界。 p.setBorder(border);//将设置好的边界显示出来 JButton button1 = new JButton();//创建按钮对象 button1.setText("我的日历");//设置按钮文本 //button1.addActionListener(new ActionListener(){ // public void acctionPerformed(ActionEvent e){ //弹出对话框 // JOptionPane.showMessageDialog(null,"hello world"); // } // }); root.add(button1,BorderLayout.PAGE_START);//将按钮添加到容器中 //将窗体设置为居中显示 this.setSize(600,600); this.setLocationRelativeTo(null); } }
package practice; import javax.swing.JFrame; public class SwingDemo { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() {//事件分发线程,来保证GUI在事件分发线程中创建 //@Override public void run() { createGUI(); } }); } private static void createGUI() { myFrame frame = new myFrame("日历"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭方式 frame.setSize(800,600);//设置窗体大小 frame.setVisible(true);//使窗体可见 } }


__EOF__

本文作者userName
本文链接https://www.cnblogs.com/20kkk/p/16537573.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   鹅城小铁匠  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
Fork me on GitHub
点击右上角即可分享
微信分享提示