我希望有我的应用程序反应被扫描条形码触发按钮按下。 例如,用户可以扫描((PRINT))条码以激活打印按钮。
条形码只会被视为如果用户已经进入了一些文字。 我不知道,如果扫描仪将设置追加对端输入或一个标签或什么都没有,所以我不想做这个基础上的假设。
该应用程序是一个Java / Swing应用程序。
我已经看过键绑定/动作映射等,但他们似乎在关键和弦/单键条目被聚焦。 我需要它不会触发绑定,直到输入整个字符串。
棘手的一点是,这应该工作无论用户在屏幕上聚焦。 他们将无法正常进入(字符,所以在某些类型的触发可能会奏效。我不知道如何处理,虽然该字符串的其余部分。
编辑:如果道歉是没有问题的清楚,但条形码扫描仪是没有什么“特殊”的应用程序,它就像另一个键盘。 所以用户不会打字的(打印),但有效的是什么条形码扫描器会做,如果是有道理的。
因此,只有两种方式来触发打印:按下按钮,或“输入”的字符串(打印)。 最棘手的部分是,用户可以在任何地方应用集中。 我只是担心如果应用集中作为一个整体,而不是该领域的用户上集中。 有问题的特定的屏幕上有checkbuttons和左/右选择,因此用户并不一定会被输入到一个领域。
我有一个问题,就像你的,并创建了一个项目(概念的一些问题,目前的证据),使条形码处理在挥杆更容易。
它是基于一个事实,即条形码阅读器模拟键盘,但不同的人类,他们的“类型”有一定的时间。 它基本上允许你听“条形码读取”的事件。
项目位置: https://github.com/hablutzel1/swingbarcodelistener
演示用法:
public class SimpleTest extends JFrame {
public SimpleTest() throws HeadlessException {
// start of listening for barcode events
Toolkit.getDefaultToolkit().addAWTEventListener(new BarcodeAwareAWTEventListener(new BarcodeCapturedListener() {
@Override
public void barcodeCaptured(String barcode) {
JOptionPane.showMessageDialog(SimpleTest.this, "barcode captured: " + barcode);
}
}), AWTEvent.KEY_EVENT_MASK);
// end of listening for barcode events
getContentPane().setLayout(new FlowLayout());
getContentPane().add(new JLabel("Capture barcode demo"));
getContentPane().add(new JTextField(25));
}
public static void main(String[] args) {
SimpleTest simpleTest = new SimpleTest();
simpleTest.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
simpleTest.setVisible(true);
simpleTest.pack();
}
}
它现在有一些问题,但作为一个起点,我认为它是好的,如果你有时间去改进它,将是巨大的。
纠正我,如果我missunderstood,但它听起来像是你有一个条形码扫描仪,将文本输入的字段。 但要提醒,无论它是如何输入的(由条码扫描器或按键)时,在该领域的文本等于什么(所以动作可发生)。
我建议你使用DocumentListener
提醒您更改文本字段的-这应与你的要求工作。
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class TempProject extends Box{
public TempProject(){
super(BoxLayout.Y_AXIS);
final JTextArea ta = new JTextArea();
ta.getDocument().addDocumentListener(new DocumentListener(){
@Override
public void changedUpdate(DocumentEvent arg0) {
doSomething();
}
@Override
public void insertUpdate(DocumentEvent arg0) {
doSomething();
}
@Override
public void removeUpdate(DocumentEvent arg0) {
doSomething();
}
public void doSomething(){
if(ta.getText().equalsIgnoreCase("print")){
System.out.println("Printing...");
//Need to clear text in a separate swing thread
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
ta.setText("");
}});
}
}
});
add(ta);
}
public static void main(String args[])
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setContentPane(new TempProject());
frame.setPreferredSize(new Dimension(500, 400));
frame.pack();
frame.setVisible(true);
}
});
}
}
我不完全理解的问题,这是一个有点太长加入了注释。 据我的理解是,你有一个Swing应用程序,并且有3点不同的方式来触发相同的操作条形码扫描器
- 用户输入的UI一些文字(“打印”),这将触发打印动作
- 该UI可以由用户按压打印按钮,这触发了打印动作
- 用户可以扫描“打印”条形码和这触发了对打印动作
我不明白的部分是为什么条形码扫描,应触发打印动作,有什么做的UI部分,用户可以输入文本。
我假定条形码的扫描发生在另一个线程则在事件指派线程。 一旦你扫描的条形码和解析它,你需要触发了“打印”操作。 您可以在不打扰通过UI直接去做到这一点。