Java里Swing的生成商品图片练习代码(11)

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写的程序。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值