java 条形码扫描_java条形码的生成与扫描 | 学步园

本文介绍了一个Java工具类`BarcodeUtils`,用于生成和扫描条形码。利用`barbecue-1.5-beta1.jar`和`jbarcode-0.2.8.jar`库,该类提供了根据数字字符串创建条形码图片的方法,以及通过监听键盘输入来模拟条形码扫描的功能。此外,还详细说明了如何区分键盘输入和扫描枪输入的逻辑。
摘要由CSDN通过智能技术生成

部分代码来自网上,所需jar包:barbecue-1.5-beta1.jar,jbarcode-0.2.8.jar

import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.awt.image.BufferedImage;

import java.io.FileOutputStream;

import javax.swing.JFrame;

import org.jbarcode.JBarcode;

import org.jbarcode.encode.Code39Encoder;

import org.jbarcode.encode.EAN13Encoder;

import org.jbarcode.paint.BaseLineTextPainter;

import org.jbarcode.paint.EAN13TextPainter;

import org.jbarcode.paint.WideRatioCodedPainter;

import org.jbarcode.paint.WidthCodedPainter;

import org.jbarcode.util.ImageUtil;

import net.sourceforge.barbecue.Barcode;

import net.sourceforge.barbecue.BarcodeException;

import net.sourceforge.barbecue.BarcodeFactory;

/**

* @description 针对条形码的帮助类

* @使用方法 类名调用

* @方法一:getNumStringByBarcode() 扫描条形码得到对应的数字字符串

* @方法二:(可以不用,方法三取代)getBarcodeByNumString(String numStr) 通过一串数字字符串得到条形码(swing显示)

* @author

* @区分键盘输入还是扫描枪输入 思路:扫描输入的间隔比较均匀且时间很短(小于50毫秒), 而手动输入间隔至少在100毫秒以上。

* @方法三:createBarcodePictureByString(String numStr,String path)

*/

public class BarcodeUtils {

static long timeMillis1;

static long timeMillis2;// 前后进入keyPressed()方法的系统时间毫秒值

// 求间隔时间时用到的标志位,每进来一次keyPressed方法,把flag置反,并且记录当前系统的时间毫秒值前后相减,得到间隔时间

static boolean IntervalFlag = false;

static int count = 0;// 进入一次keyPressed()方法加1,第一次进入是不算时间间隔,count=2时开始算,另外可以用来判断是否是连续多次输入

static StringBuilder sb = null;// 依次放入输入的数字

static String str = "";// 存储最后要返回的 条形码字符串

static long timeInterval = 0;

static String str2 = "";// 在区分 键盘输入-扫描输入、扫描输入-键盘输入、扫描输入-扫描输入 这三种情况时 用到

// 存储丢失的一个字符串

static boolean scanningGunFlag = false; // 是否是 扫描枪输入

static boolean kpressedFlag3 = false;// 是否有键盘输入

static boolean keyboardAndScanFlag4 = false;// 判断是不是 先有键盘输入 再有扫描输入

/**

*

* @param numStr 条形码字符串

* @param path 图片存储路径,例如"f:/"

*/

public static void createBarcodePictureByString(String numStr,String path) {

try {

JBarcode localJBarcode = new JBarcode(EAN13Encoder.getInstance(),

WidthCodedPainter.getInstance(),

EAN13TextPainter.getInstance());

//BufferedImage localBufferedImage = localJBarcode.createBarcode(numStr);

//saveToGIF(localBufferedImage, "aaa.gif");

localJBarcode.setEncoder(Code39Encoder.getInstance());

localJBarcode.setPainter(WideRatioCodedPainter.getInstance());

localJBarcode.setTextPainter(BaseLineTextPainter.getInstance());

localJBarcode.setShowCheckDigit(false); //xx str = "JBARCODE-39";

BufferedImage localBufferedImage = localJBarcode.createBarcode(numStr);

saveToPNG(localBufferedImage, numStr+".png",path);

} catch (Exception localException) {

localException.printStackTrace();

}

}

/**

* 此方法的作用是更具条形码字符串生成一个条形码(swing界面显示出来)

*

* @param numStr

* 条形码数字对象的字符串

*/

@SuppressWarnings("static-access")

public static void getBarcodeByNumString(String numStr) {

JFrame frame = new JFrame("getBarcodeByNumString");

BarcodeUtils u = new BarcodeUtils();

Component contents = u.usingBarbecueAsSwingComponent(numStr);

frame.getContentPane().add(contents, BorderLayout.CENTER);

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

frame.pack();

frame.setVisible(true);

}

/**

* 扫描条形码的到数字字符串

*

* @return 条形码对应的数字字符串

*/

public static String getNumStringByBarcode() {

JFrame frame = new JFrame("getNumStringByBarcode");

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

frame.addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent e) {

count++;

if (IntervalFlag == false) {

timeMillis1 = System.currentTimeMillis();

// System.out.println(timeMillis1+":t1");

IntervalFlag = true;

} else {

timeMillis2 = System.currentTimeMillis();

// System.out.println(timeMillis2+":t2");

IntervalFlag = false;

}

if (count > 1) {

timeInterval = Math.abs(timeMillis2 - timeMillis1);

}

// System.out.print(timeInterval+"---");

if (timeInterval < 50) {

count++;

if (sb == null)

sb = new StringBuilder();

if (e.getKeyCode() >= KeyEvent.VK_0

&& e.getKeyCode() <= KeyEvent.VK_9) {

// System.out.println(e.getKeyCode()+":"+e.getKeyChar());

sb.append(e.getKeyChar());

kpressedFlag3 = true;

}

if (e.getKeyCode() == KeyEvent.VK_ENTER) {

if (scanningGunFlag == true

|| keyboardAndScanFlag4 == true) {

str = str2 + sb.toString();

str2 = "";

} else {

str = sb.toString();

}

sb = null;

if (str.length() >= 8) {

System.out.println("条形码:" + str);

// 把条形码写入到xml中

String path = DOM4jXML.class.getResource("")

.toString() + "barcodeInfo.xml";

path = path.substring(6, path.length());

DOM4jXML.createBarcodeXml(path, str,

System.currentTimeMillis() + "");

} else {

str = "";

}

if (count >= 8) {// 连续输入多次次以上并且enter后则是扫描输入

scanningGunFlag = true;

count = 0;

}

}

// System.out.println("str-:"+str);

if (kpressedFlag3 == true && scanningGunFlag == false) {

// 首先是键盘输入再有扫描输入

keyboardAndScanFlag4 = true;

}

} else {

if (e.getKeyCode() >= KeyEvent.VK_0

&& e.getKeyCode() <= KeyEvent.VK_9

&& scanningGunFlag == true) {

// 连续扫描

str2 = "" + e.getKeyChar();

}

if (e.getKeyCode() >= KeyEvent.VK_0

&& e.getKeyCode() <= KeyEvent.VK_9

&& keyboardAndScanFlag4 == true) {

// 先按下键盘再扫描

str2 = "" + e.getKeyChar();

// System.out.println("s--:"+str2);

scanningGunFlag = false;

}

sb = null;

}

}

});

frame.pack();

frame.setVisible(true);

return str;

}

/**

* @param num

* @return Component

*/

private static Component usingBarbecueAsSwingComponent(String num) {

Barcode barcode = null;

try {

barcode = BarcodeFactory.createCode128B(num);

barcode.setBarHeight(50);

barcode.setBarWidth(1);

} catch (BarcodeException e) {

}

return barcode;

}

//一下方法为createBarcodePictureByString()需要用到的方法--//

@SuppressWarnings("unused")

private static void saveToJPEG(BufferedImage paramBufferedImage,

String paramString,String path) {

saveToFile(paramBufferedImage, paramString, "jpeg",path);

}

private static void saveToPNG(BufferedImage paramBufferedImage,

String paramString,String path) {

saveToFile(paramBufferedImage, paramString, "png",path);

}

@SuppressWarnings("unused")

private static void saveToGIF(BufferedImage paramBufferedImage,

String paramString,String path) {

saveToFile(paramBufferedImage, paramString, "gif",path);

}

private static void saveToFile(BufferedImage paramBufferedImage,

String paramString1, String paramString2,String path) {

try {

FileOutputStream localFileOutputStream = new FileOutputStream("f:/"

+ paramString1);

ImageUtil.encodeAndWrite(paramBufferedImage, paramString2,

localFileOutputStream, 96, 96);

localFileOutputStream.close();

} catch (Exception localException) {

localException.printStackTrace();

}

}

//------/

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值