当前位置:   article > 正文

JAVA用Graphics2D写一个排行榜_生成排行榜 代码

生成排行榜 代码

背景

最近需要写一个排行榜并生成海报分享朋友圈,记录一下,说不定以后能用到,生成玩文件可以自行选择是上传到OSS还是上传到本地服务器

我这边是通过企业微信推送图片,代码如果写的不好,请见谅,测试可以用

我这边使用Java的Graphics2D库来创建一个可视化的排行榜。在这个排行榜中,我们将显示一系列积分和排名。这个排行榜是生成的一张图片,可以用来分享

在开始编写代码之前,我们需要先确定排行榜的设计。排行榜可以是一个矩形区域,其中包含一个或多个排名榜单。每个排名榜单可以包含多个排名条目,每个条目表示一个人员的积分和排名。我们可以使用不同的颜色和字体样式来区分不同的元素。

在创建排行榜时,我们需要考虑以下因素:

  1. 排名:我们需要根据每个玩家的分数来计算其排名。我们可以使用一个简单的排序算法来排序玩家的分数,并将其分配到排名列表中。

  2. 积分数:我们需要显示每个玩家的分数。我们可以使用不同的颜色和字体来突出显示高分玩家,并使低分玩家的分数不那么显眼。

  3. 玩家名称:我们需要显示每个玩家的名称。我们可以使用不同的字体样式和颜色来突出显示玩家的名称,并使其与分数和排名区分开来。

  4. 排名图表:我们可以使用Graphics2D库来创建一个排名图表,显示每个玩家的排名随时间的变化。我们可以使用不同的颜色和样式来表示每个玩家,使得排名图表更加直观。

先看效果图

1.首先定一个常量类

  1. /**
  2. * @author c
  3. * @date 2023/4/13 09:59
  4. */
  5. public class PosterConstants {
  6. public static String BACKGROUND_IMAGE = "https://xxx.com/rank/bg1.jpg";
  7. }

2.定义一个画图的父类

  1. import javax.imageio.ImageIO;
  2. import java.awt.*;
  3. import java.awt.image.BufferedImage;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import java.net.URL;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10. * @author c
  11. * @date 2023/4/13 09:13
  12. */
  13. public abstract class AbstractDrawPoster<T> {
  14. Graphics2D graphics2D = null;
  15. /**
  16. * 内容颜色
  17. */
  18. private Color contentColor = new Color(0, 0, 0);
  19. /**
  20. * 标题颜色
  21. */
  22. private Color titleColor = new Color(0, 0, 0);
  23. /**
  24. * 具体左边距离
  25. */
  26. private int contentMarginLeft = 60;
  27. /**
  28. * 距离顶部距离
  29. */
  30. private int contentMarginTop = 700;
  31. /**
  32. * 每一列的宽度
  33. */
  34. private int rowWidth = 220;
  35. /**
  36. * 每一列的高度
  37. */
  38. private int rowHeight = 55;
  39. /**
  40. * 内容用到的字体 加粗方式 字号
  41. */
  42. private Font contentFont = new Font("思源宋体 CN", Font.BOLD, 33);
  43. /**
  44. * 标题用到的字体 加粗方式 字号
  45. */
  46. private Font titleFont = new Font("思源宋体 CN", Font.BOLD, 33);
  47. /**
  48. * 标题距离顶部的距离
  49. */
  50. private int titleMarginTop = 650;
  51. /**
  52. * 背景图
  53. */
  54. BufferedImage backgroundImage = null;
  55. BufferedImage poster = null;
  56. /**
  57. * 设置标题距离顶部距离
  58. *
  59. * @param titleMarginTop
  60. */
  61. public void setTitleMarginTop(int titleMarginTop) {
  62. this.titleMarginTop = titleMarginTop;
  63. }
  64. private String backgroundImgUrl;
  65. List<List<String>> listData = null;
  66. public void addData(List<String> list) {
  67. if (listData == null) {
  68. listData = new ArrayList<>();
  69. }
  70. listData.add(list);
  71. }
  72. /**
  73. * 生成图片
  74. *
  75. * @param t
  76. * @param title
  77. * @return
  78. * @throws IOException
  79. */
  80. public File generateImage(T t, String title) throws IOException {
  81. dataProcessor(t);
  82. initBackground();
  83. setTitle(title);
  84. setContent();
  85. //File outputFile = File.createTempFile(UUID.randomUUID().toString(), null);
  86. File outputFile = new File("/Users/Desktop/temp/poster11.jpg");
  87. ImageIO.write(poster, "jpg", outputFile);
  88. return outputFile;
  89. }
  90. /**
  91. * 填充数据
  92. *
  93. * @param t
  94. * @return
  95. */
  96. public abstract void dataProcessor(T t);
  97. /**
  98. * @param x 列表距离左边的距离
  99. * @param y 列表距离顶部的距离
  100. */
  101. public void setMargin(int x, int y) {
  102. this.contentMarginLeft = x;
  103. this.contentMarginTop = y;
  104. }
  105. /**
  106. * 设置每一列的宽高
  107. *
  108. * @param width
  109. * @param height
  110. */
  111. public void setWidthAndHeight(int width, int height) {
  112. this.rowWidth = width;
  113. this.rowHeight = height;
  114. }
  115. /**
  116. * 设置内容字体颜色
  117. *
  118. * @param contentColor
  119. */
  120. public void setContentColor(Color contentColor) {
  121. this.contentColor = contentColor;
  122. }
  123. /**
  124. * 设置标题字体颜色
  125. *
  126. * @param titleColor
  127. */
  128. public void setTitleColor(Color titleColor) {
  129. this.titleColor = titleColor;
  130. }
  131. /**
  132. * 设置内容字体大小
  133. *
  134. * @param contentFont
  135. */
  136. public void setContentFont(Font contentFont) {
  137. this.contentFont = contentFont;
  138. }
  139. /**
  140. * 设置标题字体大小
  141. *
  142. * @param titleFont
  143. */
  144. public void setTitleFont(Font titleFont) {
  145. this.titleFont = titleFont;
  146. }
  147. /**
  148. * 设置背景图片
  149. *
  150. * @param backgroundImgUrl
  151. */
  152. public void setBackgroundImgUrl(String backgroundImgUrl) {
  153. this.backgroundImgUrl = backgroundImgUrl;
  154. }
  155. /**
  156. * 初始化背景
  157. * @throws IOException
  158. */
  159. public void initBackground() throws IOException {
  160. backgroundImage = ImageIO.read(new URL(backgroundImgUrl));
  161. poster = new BufferedImage(backgroundImage.getWidth(), backgroundImage.getHeight(), BufferedImage.TYPE_INT_RGB);
  162. graphics2D = poster.createGraphics();
  163. graphics2D.drawImage(backgroundImage, 0, 0, null);
  164. }
  165. /**
  166. * 设置标题
  167. * @param title
  168. */
  169. public void setTitle(String title) {
  170. graphics2D.setFont(titleFont);
  171. graphics2D.setColor(titleColor);
  172. FontMetrics fm1 = graphics2D.getFontMetrics();
  173. int stringWidth1 = fm1.stringWidth(title);
  174. graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  175. int centerX1 = (backgroundImage.getWidth() - stringWidth1) / 2;
  176. graphics2D.drawString(title, centerX1, titleMarginTop);
  177. }
  178. /**
  179. *设置内容
  180. */
  181. public void setContent() {
  182. int numColumns = listData.size();
  183. int numRows = listData.get(0).size();
  184. graphics2D.setFont(contentFont);
  185. graphics2D.setColor(contentColor);
  186. for (int i = 0; i < numColumns; i++) {
  187. int y = contentMarginTop + i * rowHeight;
  188. for (int j = 0; j < numRows; j++) {
  189. int x = contentMarginLeft + j * rowWidth;
  190. String data = listData.get(i).get(j);
  191. int stringWidth = getFontWidth(data);
  192. int centerX = x + (rowWidth - stringWidth) / 2;
  193. graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  194. graphics2D.drawString(data, centerX, y);
  195. }
  196. }
  197. }
  198. /**
  199. * 获取单个内容的宽度
  200. * @param data
  201. * @return
  202. */
  203. public int getFontWidth(String data) {
  204. FontMetrics fm = graphics2D.getFontMetrics();
  205. return fm.stringWidth(data);
  206. }
  207. }

3.定义实现类:

  1. import com.jch.common.constant.PosterConstants;
  2. import com.jch.order.dto.TherapistDTO;
  3. import com.jch.order.entity.UnitPriceEntity;
  4. import com.jch.service.draw.AbstractDrawPoster;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.stereotype.Service;
  7. import java.io.IOException;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. /**
  11. * @author c
  12. * @date 2023/4/13 09:57
  13. */
  14. @Service
  15. @Slf4j
  16. public class RankDrawPoster extends AbstractDrawPoster<Object> {
  17. @Override
  18. public void dataProcessor(Object unitPriceEntity) {
  19. setBackgroundImgUrl(PosterConstants.BACKGROUND_IMAGE);
  20. setHeader();
  21. mockData();
  22. }
  23. public void setHeader() {
  24. List<String> column = new ArrayList<>();
  25. column.add("排名");
  26. column.add("姓名");
  27. column.add("总积分");
  28. addData(column);
  29. }
  30. public void mockData() {
  31. for (int i = 5; i > 0; i--) {
  32. List<String> column = new ArrayList<>();
  33. column.add(String.valueOf(i + 1));
  34. column.add("张三" + i);
  35. column.add(String.valueOf(i * 10));
  36. addData(column);
  37. }
  38. }
  39. public static void main(String[] args) throws IOException {
  40. RankDrawPoster rankDrawPoster= new RankDrawPoster();
  41. rankDrawPoster.generateImage(new Object(),"积分排行榜");
  42. }
  43. }

如果有更好的写法也可以分享给我,我可以学习一下

总之,使用Java的Graphics2D库可以非常方便地创建一个可视化的排行榜

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/911593
推荐阅读
相关标签
  

闽ICP备14008679号