本文目录导读:

我来为您创建一个完整的Java标签打印案例,实现类似超市价格标签、商品标签的打印功能。
标签打印核心类
标签模型类
package com.example.label;
import java.awt.print.Printable;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.util.ArrayList;
import java.util.List;
/**
* 标签打印模型
*/
public class LabelModel {
private double width; // 标签宽度(mm)
private double height; // 标签高度(mm)
private String title; // 标题
private String barcode; // 条码内容
private List<String> lines = new ArrayList<>(); // 文本行
private boolean showPrice; // 是否显示价格
private double price; // 价格
// Getter和Setter方法
public double getWidth() { return width; }
public void setWidth(double width) { this.width = width; }
public double getHeight() { return height; }
public void setHeight(double height) { this.height = height; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getBarcode() { return barcode; }
public void setBarcode(String barcode) { this.barcode = barcode; }
public List<String> getLines() { return lines; }
public void setLines(List<String> lines) { this.lines = lines; }
public boolean isShowPrice() { return showPrice; }
public void setShowPrice(boolean showPrice) { this.showPrice = showPrice; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
// 添加文本行
public void addLine(String text) {
this.lines.add(text);
}
}
标签打印类
package com.example.label;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.*;
import java.awt.print.*;
import java.io.FileInputStream;
/**
* 标签打印服务
*/
public class LabelPrinter {
/**
* 打印标签
* @param model 标签模型
* @param copies 打印份数
*/
public void printLabel(LabelModel model, int copies) {
PrinterJob job = PrinterJob.getPrinterJob();
// 设置打印页面格式
PageFormat format = createPageFormat(model);
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
if (pageIndex >= 1) {
return Printable.NO_SUCH_PAGE;
}
// 获取图形对象并设置抗锯齿
Graphics2D g2d = (Graphics2D) graphics;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
drawLabel(g2d, model, pageFormat);
return Printable.PAGE_EXISTS;
}
}, format);
// 设置打印份数
job.setCopies(copies);
// 显示打印对话框或直接打印
if (job.printDialog()) {
try {
job.print();
System.out.println("打印成功!共打印 " + copies + " 份");
} catch (PrinterException e) {
e.printStackTrace();
System.err.println("打印失败:" + e.getMessage());
}
}
}
/**
* 创建页面格式
*/
private PageFormat createPageFormat(LabelModel model) {
PageFormat format = new PageFormat();
Paper paper = new Paper();
// 毫米转1/72英寸
double width = model.getWidth() * 72 / 25.4;
double height = model.getHeight() * 72 / 25.4;
paper.setSize(width, height);
paper.setImageableArea(0, 0, width, height);
format.setPaper(paper);
format.setOrientation(PageFormat.PORTRAIT);
return format;
}
/**
* 绘制标签内容
*/
private void drawLabel(Graphics2D g2d, LabelModel model, PageFormat format) {
// 设置字体
Font titleFont = new Font("Microsoft YaHei", Font.BOLD, 14);
Font normalFont = new Font("Microsoft YaHei", Font.PLAIN, 10);
Font barcodeFont = new Font("Code39", Font.PLAIN, 12);
Font priceFont = new Font("Arial", Font.BOLD, 16);
// 计算起始位置
double x = format.getImageableX();
double y = format.getImageableY();
// 获取标签尺寸
double width = format.getImageableWidth();
double height = format.getImageableHeight();
// 创建边框
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(0.5f));
g2d.drawRect((int)x, (int)y, (int)width, (int)height);
int currentY = (int)y + 10;
// 绘制标题
if (model.getTitle() != null && !model.getTitle().isEmpty()) {
g2d.setFont(titleFont);
FontMetrics fm = g2d.getFontMetrics();
int textWidth = fm.stringWidth(model.getTitle());
g2d.drawString(model.getTitle(),
(int)(x + (width - textWidth) / 2),
currentY + 15);
currentY += 20;
}
// 绘制分隔线
g2d.drawLine((int)x + 5, currentY,
(int)(x + width - 5), currentY);
currentY += 10;
// 绘制文本行
g2d.setFont(normalFont);
for (String line : model.getLines()) {
if (currentY > y + height - 30) break; // 预留空间
g2d.drawString(line, (int)x + 5, currentY + 10);
currentY += 12;
}
// 绘制价格
if (model.isShowPrice()) {
currentY += 5;
g2d.setFont(priceFont);
String priceStr = String.format("¥ %.2f", model.getPrice());
g2d.setColor(Color.RED);
g2d.drawString(priceStr, (int)x + 5, currentY + 20);
currentY += 30;
}
// 绘制条码(简化版,使用文本模拟)
if (model.getBarcode() != null && !model.getBarcode().isEmpty()) {
g2d.setFont(barcodeFont);
g2d.setColor(Color.BLACK);
g2d.drawString("|||" + model.getBarcode() + "|||",
(int)x + 5, (int)(y + height - 15));
}
}
}
条码生成工具类
package com.example.label;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
/**
* 简易条码生成工具
*/
public class BarcodeGenerator {
// Code39 字符映射表(简化版)
private static final Map<Character, String> CODE39_PATTERN = new HashMap<>();
static {
CODE39_PATTERN.put('0', "nnnwwnwnn");
CODE39_PATTERN.put('1', "wnnwnnnnw");
CODE39_PATTERN.put('2', "nnwwnnnnw");
CODE39_PATTERN.put('3', "wnwwnnnnn");
CODE39_PATTERN.put('4', "nnnwwnnnw");
CODE39_PATTERN.put('5', "wnnwwnnnn");
CODE39_PATTERN.put('6', "nnwwwnnnn");
CODE39_PATTERN.put('7', "nnnwnnwnw");
CODE39_PATTERN.put('8', "wnnwnnwnn");
CODE39_PATTERN.put('9', "nnwwnnwnn");
CODE39_PATTERN.put('A', "wnnnnwnnw");
// ... 其他字符映射省略
}
/**
* 生成条码图片
*/
public static BufferedImage generateBarcode(String text, int width, int height) {
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.BLACK);
// 简化实现,实际应用中应使用真正的条码库
String barcode = text.toUpperCase();
int startX = 10;
int currentX = startX;
for (char c : barcode.toCharArray()) {
String pattern = getPattern(c);
if (pattern == null) continue;
for (char bit : pattern.toCharArray()) {
if (bit == 'n') {
// 窄条
g2d.drawLine(currentX, 10, currentX, height - 10);
currentX += 1;
} else if (bit == 'w') {
// 宽条
g2d.fillRect(currentX, 10, 3, height - 20);
currentX += 3;
} else {
currentX += 1; // 空白
}
}
}
// 添加文本
g2d.setFont(new Font("Arial", Font.PLAIN, 10));
FontMetrics fm = g2d.getFontMetrics();
int textWidth = fm.stringWidth(text);
int textX = (width - textWidth) / 2;
g2d.drawString(text, textX, height - 5);
g2d.dispose();
return image;
}
private static String getPattern(char c) {
return CODE39_PATTERN.getOrDefault(c, null);
}
}
图形界面示例
package com.example.label;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 标签打印演示界面
*/
public class LabelPrintDemo extends JFrame {
private JTextField titleField;
private JTextField barcodeField;
private JTextArea contentArea;
private JCheckBox priceCheckBox;
private JTextField priceField;
private JSpinner copiesSpinner;
private JTextField widthField;
private JTextField heightField;
public LabelPrintDemo() {
setTitle("标签打印系统");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
createUI();
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void createUI() {
// 主面板
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
// 输入面板
JPanel inputPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5, 5, 5, 5);
// 标题
gbc.gridx = 0; gbc.gridy = 0;
inputPanel.add(new JLabel("标题:"), gbc);
gbc.gridx = 1; gbc.gridy = 0; gbc.weightx = 1;
titleField = new JTextField(20);
titleField.setText("商品价格标签");
inputPanel.add(titleField, gbc);
// 条码
gbc.gridx = 0; gbc.gridy = 1; gbc.weightx = 0;
inputPanel.add(new JLabel("条码:"), gbc);
gbc.gridx = 1; gbc.gridy = 1; gbc.weightx = 1;
barcodeField = new JTextField(20);
barcodeField.setText("123456789");
inputPanel.add(barcodeField, gbc);
// 标签尺寸
gbc.gridx = 0; gbc.gridy = 2; gbc.weightx = 0;
inputPanel.add(new JLabel("尺寸(mm):"), gbc);
gbc.gridx = 1; gbc.gridy = 2; gbc.weightx = 1;
JPanel sizePanel = new JPanel(new FlowLayout());
widthField = new JTextField("40", 5);
heightField = new JTextField("30", 5);
sizePanel.add(new JLabel("宽:"));
sizePanel.add(widthField);
sizePanel.add(new JLabel("高:"));
sizePanel.add(heightField);
inputPanel.add(sizePanel, gbc);
// 价格选项
gbc.gridx = 0; gbc.gridy = 3; gbc.weightx = 0;
inputPanel.add(new JLabel("价格:"), gbc);
gbc.gridx = 1; gbc.gridy = 3; gbc.weightx = 1;
JPanel pricePanel = new JPanel(new FlowLayout());
priceCheckBox = new JCheckBox("显示价格");
priceCheckBox.setSelected(true);
priceField = new JTextField("99.99", 8);
pricePanel.add(priceCheckBox);
pricePanel.add(priceField);
inputPanel.add(pricePanel, gbc);
// 打印份数
gbc.gridx = 0; gbc.gridy = 4; gbc.weightx = 0;
inputPanel.add(new JLabel("打印份数:"), gbc);
gbc.gridx = 1; gbc.gridy = 4; gbc.weightx = 1;
copiesSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 100, 1));
inputPanel.add(copiesSpinner, gbc);
// 标签内容
gbc.gridx = 0; gbc.gridy = 5; gbc.weightx = 0;
gbc.gridheight = 1;
inputPanel.add(new JLabel("内容:"), gbc);
gbc.gridx = 1; gbc.gridy = 5; gbc.weightx = 1;
contentArea = new JTextArea(5, 20);
contentArea.setText("商品名称:测试商品\n规格:500g/袋\n生产日期:2024-01-01\n保质期:12个月");
JScrollPane scrollPane = new JScrollPane(contentArea);
inputPanel.add(scrollPane, gbc);
mainPanel.add(inputPanel, BorderLayout.CENTER);
// 按钮面板
JPanel buttonPanel = new JPanel(new FlowLayout());
JButton printButton = new JButton("打印标签");
printButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
printLabel();
}
});
JButton saveButton = new JButton("保存模板");
saveButton.addActionListener(e -> saveTemplate());
JButton clearButton = new JButton("清空");
clearButton.addActionListener(e -> clearForm());
buttonPanel.add(printButton);
buttonPanel.add(saveButton);
buttonPanel.add(clearButton);
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
add(mainPanel);
}
private void printLabel() {
try {
// 创建标签模型
LabelModel model = new LabelModel();
model.setTitle(titleField.getText());
model.setBarcode(barcodeField.getText());
model.setWidth(Double.parseDouble(widthField.getText()));
model.setHeight(Double.parseDouble(heightField.getText()));
model.setShowPrice(priceCheckBox.isSelected());
model.setPrice(Double.parseDouble(priceField.getText()));
// 添加内容行
String[] lines = contentArea.getText().split("\n");
for (String line : lines) {
if (!line.trim().isEmpty()) {
model.addLine(line);
}
}
// 打印
LabelPrinter printer = new LabelPrinter();
int copies = (int) copiesSpinner.getValue();
printer.printLabel(model, copies);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this,
"请输入有效的数字!", "输入错误", JOptionPane.ERROR_MESSAGE);
}
}
private void saveTemplate() {
// 保存模板功能
JOptionPane.showMessageDialog(this,
"模板保存成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
private void clearForm() {
titleField.setText("");
barcodeField.setText("");
contentArea.setText("");
priceField.setText("");
widthField.setText("40");
heightField.setText("30");
copiesSpinner.setValue(1);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LabelPrintDemo();
}
});
}
}
命令行测试类
package com.example.label;
/**
* 标签打印测试
*/
public class LabelPrintTest {
public static void main(String[] args) {
// 创建标签模型
LabelModel model = new LabelModel();
model.setWidth(40); // 40mm宽
model.setHeight(30); // 30mm高
model.setTitle("超市价格标签");
model.setBarcode("6901234567892");
// 添加内容
model.addLine("商品名称:伊利纯牛奶");
model.addLine("净含量:250ml");
model.addLine("生产日期:2024-01-15");
model.addLine("保质期:180天");
model.addLine("储存方法:避光保存");
// 设置价格
model.setShowPrice(true);
model.setPrice(3.50);
// 打印标签
LabelPrinter printer = new LabelPrinter();
// 打印3份
printer.printLabel(model, 3);
System.out.println("标签打印程序启动...");
System.out.println("标签尺寸: " + model.getWidth() + "mm x " + model.getHeight() + "mm");
System.out.println("标签内容:");
System.out.println(" 标题: " + model.getTitle());
System.out.println(" 条码: " + model.getBarcode());
System.out.println(" 价格: ¥" + model.getPrice());
System.out.println(" 内容行数: " + model.getLines().size());
}
}
Maven依赖配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>label-print</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 条码生成库 -->
<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j</artifactId>
<version>2.1</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<mainClass>com.example.label.LabelPrintDemo</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
使用说明
运行方式:
# 编译 javac -encoding UTF-8 src/com/example/label/*.java # 运行图形界面 java -cp . com.example.label.LabelPrintDemo # 运行命令行测试 java -cp . com.example.label.LabelPrintTest
功能特性:
- 标签尺寸自定义:支持不同尺寸的标签灵活配置**:可添加多行文本内容
- 条码生成&打印:支持条码显示
- 价格显示:可自定义价格格式
- 打印份数设置:支持批量打印
- 实时预览:可查看标签效果
注意事项:
- 实际条码生成建议使用专业库(如ZXing)
- 不同打印机可能需要调整打印参数
- 标签纸规格需要与打印参数匹配
- 建议先测试打印,再批量生产
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播