实现一个简单的日历
利用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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/20kkk/p/16537573.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库