Graphics2D.drawString換行示例

java 生成圖片使用 g.drawString 時,若是文本太長,超出的部分會丟失java

drawString 無法自動換行ide

解決方案示例Demo以下 : 測試

  1 import java.awt.Color;
  2 import java.awt.Font;
  3 import java.awt.Graphics2D;
  4 import java.awt.font.FontRenderContext;
  5 import java.awt.geom.Rectangle2D;
  6 import java.awt.image.BufferedImage;
  7 import java.io.FileOutputStream;
  8 import java.io.IOException;
  9 import java.util.ArrayList;
 10 import java.util.List;
 11 
 12 import com.sun.image.codec.jpeg.JPEGCodec;
 13 import com.sun.image.codec.jpeg.JPEGImageEncoder;
 14 
 15 
 16 public class DrawStringTest {
 17 
 18     /**
 19      * @param args
 20      */
 21     public static void main(String[] args) {
 22         BufferedImage bufferImage = null;
 23         FileOutputStream output = null ;
 24         
 25         String info = "客戶姓名:唐伯虎;身份證號:12345678906666666;某某合同編號:張店哈哈哈哈高抵字2015年第02-30在參數StringFormat標誌位 !";
 26         int w = 500 ;//畫布寬度
 27         int h = 300 ;//畫布高度
 28         try {
 29             bufferImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB) ;
 30             Graphics2D g = bufferImage.createGraphics() ;
 31             Font font = new Font("微軟雅黑",Font.PLAIN,30) ;
 32             List<String> line_list = new ArrayList<String>();
 33 
 34             FontRenderContext frc = g.getFontRenderContext();
 35             g.getFontRenderContext();
 36             Rectangle2D stringBounds = font.getStringBounds(info, frc);
 37             double fontWidth = stringBounds.getWidth();
 38             System.out.println("不換行時文本寬度 : "+fontWidth);
 39             if(fontWidth <= w){
 40                 line_list.add(info);
 41             }else{
 42                 int text_width = w ;//輸出文本寬度,這裏就以畫布寬度做爲文本寬度測試
 43                 double bs =  fontWidth/text_width ;//文本長度是文本框長度的倍數
 44                 int line_char_count = (int)Math.ceil(info.length() / bs) ;//每行大概字數
 45                 int begin_index = 0 ;
 46                 while(begin_index < info.length()){
 47                     int end_index = begin_index + line_char_count ;
 48                     if(end_index >= info.length()){
 49                         end_index = info.length();
 50                     }
 51                     String line_str = info.substring(begin_index, end_index);
 52                     Rectangle2D tempStringBounds = font.getStringBounds(line_str, frc);
 53                     int tzcs = 0 ;//調整次數
 54                     int tzzs = 1 ;//調整字數,臨時文本的字符串長度大於要求的文本寬度時,每次減小臨時文本的字數,而後從新測量文本寬度
 55                     while(tempStringBounds.getWidth() > text_width){
 56                         line_str = line_str.substring(0, line_str.length() - tzzs );//每次向前 tzzs 個字符從新計算(待優化)
 57                         tempStringBounds = font.getStringBounds(line_str, frc);
 58                         tzcs++;
 59                     }
 60                     System.out.println("調整"+(end_index - begin_index -line_str.length())+"個數字,調整了"+tzcs+"次,當前行寬度:"+tempStringBounds.getWidth());
 61                     line_list.add(line_str);
 62                     begin_index = begin_index + line_str.length()  ;
 63                 }
 64             }
 65    
 66             g.setColor(Color.WHITE);
 67             g.fillRect(0,0,w,h);//填充整個屏幕  
 68             g.setFont(font);
 69             g.setColor(Color.RED) ;
 70             
 71             for(int i = 0;i<line_list.size();i++){
 72                 String line_str = line_list.get(i);
 73                 g.drawString(line_str, 0, (i+2)*35) ;//35爲每行的高度
 74             }
 75             
 76             g.drawString("Graphics2D.drawString換行示例", 0, 35) ;
 77             g.dispose() ;
 78             
 79             output = new FileOutputStream ("E:/1.jpg");//輸入文件到E盤根目錄
 80             System.out.println("文件 E:/1.jpg 已經生成");
 81             JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(output) ;
 82             en.encode(bufferImage) ;
 83             
 84             output.flush() ;
 85         } catch (Exception e) {
 86             e.printStackTrace();
 87         } finally{
 88             if(output!=null) {
 89                 try {
 90                     output.close();
 91                 } catch (IOException e) {
 92                     e.printStackTrace();
 93                 }
 94             }
 95             System.out.println("end/:-)");
 96         }
 97 
 98     }
 99 
100 }
View Code

經過計算文本寬度實現自動換行優化

相關文章
相關標籤/搜索