Eclipse 如何捕获从HID条形码扫描仪发送到文本字段的*所有*字符?
我需要从条形码扫描仪捕获输入。到目前为止,输入只是简单的alphanum文本,我在一个文本字段中捕获了它。我在文本字段中添加了一个Eclipse 如何捕获从HID条形码扫描仪发送到文本字段的*所有*字符?,eclipse,swt,barcode,hid,Eclipse,Swt,Barcode,Hid,我需要从条形码扫描仪捕获输入。到目前为止,输入只是简单的alphanum文本,我在一个文本字段中捕获了它。我在文本字段中添加了一个ModifyListener,可以看到输入到达。这很有效 我现在需要处理一个更复杂的矩阵代码,它包含多个字段的值。这些值由不可打印的字符分隔,例如RS、GS和EOT(0x1E、0x1D、0x04)。完整的数据流有一个定义良好的标题和结尾的EOT,因此我希望能够检测条形码输入,而不是手动输入 当检测到条形码时,我可以使用记录分隔符RS分割消息并将值插入相关文本字段 但是
ModifyListener
,可以看到输入到达。这很有效
我现在需要处理一个更复杂的矩阵代码,它包含多个字段的值。这些值由不可打印的字符分隔,例如RS
、GS
和EOT
(0x1E、0x1D、0x04)。完整的数据流有一个定义良好的标题和结尾的EOT
,因此我希望能够检测条形码输入,而不是手动输入
当检测到条形码时,我可以使用记录分隔符RS
分割消息并将值插入相关文本字段
但是,文本控件上的标准键处理程序会忽略这些不可打印的字符,并且它们不会出现在控件文本中。这使得不可能按计划进行
如何修改这些文本字段以接受和存储所有字符?或者我可以使用其他方法吗?这是我用来处理条形码流的代码
public class Main
{
static StringBuilder sb = new StringBuilder();
public static void main(String[] args)
{
Display d = new Display();
Shell shell = new Shell(d);
shell.setLayout(new FillLayout());
Text text = new Text(shell, 0);
text.addListener(SWT.KeyDown, new Listener()
{
@Override
public void handleEvent(Event e)
{
// only accept real characters
if (e.character != 0 && e.keyCode < 0x1000000)
{
sb.append(e.character);
String s = sb.toString();
// have start and end idents in buffer?
int i = s.indexOf("[)>");
if (i > -1)
{
int eot = s.indexOf("\u0004", i);
if (eot > -1)
{
String message = s.substring(i, eot + 1);
handleMessageHere(message);
// get ready for next message
sb = new StringBuilder();
}
}
}
}
});
shell.open();
while (!shell.isDisposed())
{
if (!d.readAndDispatch())
d.sleep();
}
}
公共类主
{
静态StringBuilder sb=新StringBuilder();
公共静态void main(字符串[]args)
{
显示d=新显示();
外壳=新外壳(d);
setLayout(新的FillLayout());
文本文本=新文本(shell,0);
text.addListener(SWT.KeyDown,newlistener())
{
@凌驾
公共无效handleEvent(事件e)
{
//只接受真实字符
if(e.character!=0&&e.keyCode<0x1000000)
{
某人附加(如字符);
字符串s=sb.toString();
//缓冲区中是否有开始和结束标识?
int i=s.indexOf(“[)>”);
如果(i>-1)
{
int-eot=s.indexOf(“\u0004”,i);
如果(eot>-1)
{
字符串消息=s.子字符串(i,eot+1);
handleMessageHere(消息);
//为下一条消息做好准备
sb=新的StringBuilder();
}
}
}
}
});
shell.open();
而(!shell.isDisposed())
{
如果(!d.readAndDispatch())
d、 睡眠();
}
}
我在Text
类中没有看到任何过滤掉字符的内容,因此这可能是在SWT用于文本的本机控件中完成的。使用文本控件似乎不太可能实现这一点。