java swing应用(3):画当前月份的日历并保存为图片

来源:互联网 发布:网络教育的报名条件 编辑:程序博客网 时间:2024/06/06 03:41
import java.text.*;  import java.awt.*;import javax.swing.*;import java.util.*;  import java.io.*;import javax.imageio.*;import java.awt.image.BufferedImage;public class GuiDemo4{    public static void main(String[] args){      GuiDemo4 gui = new GuiDemo4();      gui.go();  }  public void go(){      //创建 JFrame      JFrame frame = new JFrame();      //窗口关闭退出应该程序      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      //画图      MyDrawPanel drawPanel = new MyDrawPanel();          frame.getContentPane().add(drawPanel);      //设置大小、可见      frame.setSize(300,300);      frame.setVisible(true);             drawPanel.repaint();         File f = new File("test.jpg");        exportOtherShapesImage(f, drawPanel);       }  //保存为图片  public boolean exportOtherShapesImage(File f, MyDrawPanel panel) {      Dimension imageSize = panel.getSize();      BufferedImage image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_INT_ARGB);      Graphics2D g = image.createGraphics();      panel.paint(g);      g.dispose();      try {          ImageIO.write(image, "png", f);      } catch (IOException e) {          e.printStackTrace();          return false;      }      System.out.println("export Image -->" + f.getAbsoluteFile());      return true;  }  class MyDrawPanel extends JPanel{     public void paintComponent(Graphics g) {               //画圆角矩形        g.drawRoundRect(10, 10, 260, 260, 10, 10);        g.drawRoundRect(12, 12, 256, 256, 8, 8);        //设置字体        Font font1 = new Font("TimesRoman", Font.PLAIN, 15);         Font font2 = new Font("TimesRoman", Font.BOLD, 18);         g.setFont(font1);        //当前日期        Calendar calendar = Calendar.getInstance();         //设置指定日期(注意月份范围是0-11)        //calendar.set(2013, 10, 9);          int year = calendar.get(Calendar.YEAR);        int month = calendar.get(Calendar.MONTH);        int day = calendar.get(Calendar.DATE);              //当前月的第一天是星期几        int day1st = getWeeksOfDate(year, month, 1);         //当前月有多少天        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);         int startX = 25; //开始的X轴位置        int startY = 28; //开始的Y轴位置        int posLen = 35; //每次移动的位置长度        int x = startX + day1st * posLen; //1号的开始X轴位置        int y = startY + posLen * 2;//1号的开始Y轴位置        //画年月日        String currentDate = year + "年" + (month + 1) + "月" + day + "日";        g.drawString(currentDate, 100, startY);        //画年月日下面的直线        g.drawLine(12, startY+8, 267, startY+8);        //画星期        String[] weeks  = new String[] {"日", "一", "二", "三", "四", "五", "六"};        for (int i = 0; i < weeks.length; i++)             g.drawString(weeks[i], startX + posLen * i, startY + posLen);        //画日期        for (int j = 1; j <= days; j++){             if (j == day){                 //如果是今天,设置字体和颜色                 g.setFont(font2);                 g.setColor(Color.BLUE);                                           }             else{                 g.setFont(font1);                    g.setColor(Color.BLACK);              }             String s = padLeft(Integer.toString(j), 2);              g.drawString(s, x, y);               //星期六结束到星期日时换行,X轴回到初始位置,Y轴增加             if ((day1st + j) % 7 == 0){                 x = startX;                 y = y + posLen - 5;             }              else                 x = x + posLen;        }       }     public String padRight(String s, int n) {         return String.format("%1$-" + n + "s", s);       }     public String padLeft(String s, int n) {         return String.format("%1$" + n + "s", s);       }     // 计算星期几: 星期日至星期六的值为0-6     public int getWeeksOfDate(int year, int month, int day)     {            Calendar calendar = Calendar.getInstance();               calendar.set(year, month, day);              return calendar.get(Calendar.DAY_OF_WEEK)-1;      }    }}

结果如下: