1、需求说明
按照商品类型去生成一个图片;
图片背景颜色是随机的;
图片内容是商品的类型,比如:给出一个商品类型是水果,那么图片内容就应该是水果;
生成示例如下图所示:
2.开始编码,以下是参考代码
package imageGroupGenerate;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
public class MainFrame extends JFrame {
public MainFrame() {
// 主窗口的基本参数设置
this.setTitle("商品分组图片生成Beta V1.0");
this.setSize(600, 450);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Container container = this.getContentPane();
container.setLayout(null);
/**
* 1、文件路径设置
*/
JLabel jLabel = new JLabel("文件路径:");
jLabel.setBounds(30, 30, 100, 20);
final JTextArea jTextArea = new JTextArea();
jTextArea.setText("\"D:\\\\name.txt\"");// 设置文文本内容
/**
* <strong>垂直的滚动条设置常量</strong>
* ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED:需要多少值才会出现垂直方向的滚动条<br/>
* ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER:不出现垂直方向的滚动条<br/>
* ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS:始终出现垂直方向的滚动条<br/>
* <strong>水平的滚动条设置常量</strong>
* ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED:需要多少值才会出现水平方向的滚动条<br/>
* ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER:不出现水平方向的滚动条<br/>
* ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS:始终出现水平方向的滚动条
*/
// 垂直方向会始终出现滚动条,水平方向不会出现滚动条
JScrollPane jScrollPane = new JScrollPane(jTextArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);// 滚动面板参数设置
jTextArea.setLineWrap(true);// 内容换行
jScrollPane.setBounds(140, 30, 400, 50);// 设置滚动面板的位置及大小
container.add(jLabel);
container.add(jScrollPane);
/**
* 2、商品分组名称显示
*/
JLabel jLabel2 = new JLabel("商品分组名称:");
jLabel2.setBounds(30, 100, 100, 20);
final JTextArea jTextArea2 = new JTextArea();
/**
* <strong>垂直的滚动条设置常量</strong>
* ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED:需要多少值才会出现垂直方向的滚动条<br/>
* ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER:不出现垂直方向的滚动条<br/>
* ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS:始终出现垂直方向的滚动条<br/>
* <strong>水平的滚动条设置常量</strong>
* ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED:需要多少值才会出现水平方向的滚动条<br/>
* ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER:不出现水平方向的滚动条<br/>
* ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS:始终出现水平方向的滚动条
*/
// 垂直方向会始终出现滚动条,水平方向不会出现滚动条
JScrollPane jScrollPane2 = new JScrollPane(jTextArea2, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);// 滚动面板参数设置
jTextArea2.setLineWrap(true);// 内容换行
jTextArea2.setEnabled(false);// 禁用输入
jTextArea2.setBackground(Color.RED);// 设置背景颜色
jScrollPane2.setBounds(140, 100, 400, 200);// 设置滚动面板的位置及大小
container.add(jLabel2);
container.add(jScrollPane2);
/**
* 3、商品分组的名称导入处理动作
*/
JButton jButton = new JButton("导入名称");
jButton.setBounds(140, 320, 100, 40);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String path = jTextArea.getText().replace("\"", "");// 处理带有双引号的路径
// 判断有没有输入文件路径
if (path.length() != 0 || !"".equals(path)) {
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(path);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
jTextArea2.getText().trim();
String content = "";
byte[] buffer = new byte[10240];
int flag = 0;
while ((flag = bufferedInputStream.read(buffer)) != -1) {
content += new String(buffer, 0, flag);
}
bufferedInputStream.close();
jTextArea2.setText(content);
} catch (IOException e1) {
JOptionPane.showMessageDialog(container, "请检查文件路径");
}
} else {
JOptionPane.showMessageDialog(container, "请填写文件完整路径,例如:C:\\bootmgr\\");
}
}
});
/**
* 4、图片的生成处理动作
*/
JButton jButton2 = new JButton("生成图片");
jButton2.setBounds(250, 320, 100, 40);
jButton2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String fileName = jTextArea2.getText();
String[] files = fileName.split(",");
for (int i = 0; i < files.length; i++) {
imageGenerate(files[i]);
}
}
});
container.add(jButton);
container.add(jButton2);
this.setVisible(true);
}
// 入口方法
public static void main(String[] args) {
MainFrame jframe = new MainFrame();
}
/**
* 图片生成
*
* @param imgName 图片内容文字
*/
private void imageGenerate(String imgName) {
int width = 250;
int height = 250;
String makeNameStr = imgName;// 生成的图片文字内容
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Font font = new Font("宋体", Font.BOLD, 40);
Graphics2D g2 = (Graphics2D) bi.getGraphics();
g2.setColor(randomColor());// 背景色随机生成
g2.fillRect(0, 0, 250, 250);
g2.setColor(Color.WHITE);
g2.setFont(font);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
FontMetrics fm = g2.getFontMetrics(font);
int fontWidth = fm.stringWidth(makeNameStr);
int fontWidthX = (width - fontWidth) / 2;
int y = (height - (fm.getAscent() + fm.getDescent())) / 2 + fm.getAscent();
g2.drawString(makeNameStr, fontWidthX, y);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
Date date = new Date();
File file = new File("D:\\" + sdf.format(date));
file.mkdirs();
try {
ImageIO.write(bi, "JPEG", new File(file, (imgName + ".jpg")));
} catch (IOException e) {
e.printStackTrace();
}
}
// 随机生成颜色
private Color randomColor() {
Random random = new Random();
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
return new Color(r, g, b);
}
}
3、用代码最终实现的界面效果
4、功能演示
- 1、在D盘目录下去新建一个名为“
name.txt
”的文件,填入下面给出的商品文字内容
调味品,粮油,冷藏,冷冻,方便食品,冲调食品,饼干,烟,酒,饮料,水果,糖果,茶叶,卫生纸,面巾纸,卫生巾,纸尿片,毛巾浴巾,拖鞋,电池充电器,被子,枕头,
- 2、将name.txt文件另存为UTF8编码格式
- 3、运行代码,导入“
name.txt
”里的内容
- 4、生成图片(图片保存在D盘下,其文件名称为今年的文件夹,比如今天是2021年3月21日,那么文件夹就应该是2021)
后续:
这个还可以去优化
1、文件名称导入,应该可以支持文件浏览弹窗的方式;
2、文件名称导入,文件编码可以做解析,不会有乱码的情况(如果文件保存不是utf8编码,导入的时候会有乱码);
3、文件生成图片,假如图片生成的大小、图片背景颜色、文字过长如何去解决;
4、生成图片是不是应该给出一个提示,譬如:“文件已生成,请到xxxx目录下查看”;
5、生成图片后的保存路径能不能去设置,或者就是当前程序执行的同级目录下创建一个文件夹来放置呢?
6、如果这个不用eclipse或者idea这样的开发工具来执行代码,直接把GUI窗口丢给客户去运行,并且客户不用安装jdk,也就是将jdk嵌入起来,通过脚本来执行;
7、如果考虑到嵌入jdk的话,那么最后的程序文件大小是否能够控制,如果不能那只能将jdk作为客户首选来安装,这样才可以跑java写的程序。。。