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

2014-11-24 07:53:46 · 作者: · 浏览: 0
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; 
     }  
  }
}

结果如下: