Java 在文本字段中输入的8和4个字符上的不同操作

Java 在文本字段中输入的8和4个字符上的不同操作,java,actionlistener,java-6,Java,Actionlistener,Java 6,我正在使用一个旧的java框架(Java6)。 我必须对手动输入和扫描输入执行不同的操作 该框架以字符串、手动(通过键盘)的形式提供,长度为4个字符,需要我使用它执行操作。 通过usb扫描仪扫描时,字符串长度为8个字符,不是1个块,而是每个字符连续快速扫描 @Override public void actionPerformed(EventObject arg) { if (arg.getSource().equals(txfInput)) { if(txfInput.

我正在使用一个旧的java框架(Java6)。 我必须对手动输入和扫描输入执行不同的操作

该框架以字符串、手动(通过键盘)的形式提供,长度为4个字符,需要我使用它执行操作。 通过usb扫描仪扫描时,字符串长度为8个字符,不是1个块,而是每个字符连续快速扫描

@Override
public void actionPerformed(EventObject arg) {
    if (arg.getSource().equals(txfInput)) {
        if(txfInput.length()==4){
           doAction(txfInput);
        }else if(txfInput.length()==8){
           doOtherAction(txfInput);
        }
    }
}
这种方法的问题是,当使用扫描仪扫描时,它会在8的第4个字符上触发。我怎样才能让它通过第四个字符

我还没有测试过这一点,但我认为这将相当于我在Swing中的代码

public class Test extends JFrame {
  JTextField text = new JTextField("Press Return", 8);

  public Test() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    text.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
       if(text.getText().length()==4){
        do something
       } else if(text.getText().length()==8){
         do something else
       }
      }
   });

  getContentPane().add(text, "Center");
   pack();
  }

  public static void main(String[] args) {
   new Test().setVisible(true);
  }
}

ActionListener只有在收到Enter后才会触发,而不是逐个字符触发?这意味着对于扫描仪输入,text.getText()值的长度将始终为8个字符

如果没有,也许可以添加一个KeyListener来捕获手动输入事件并检查长度是否为4,并为扫描程序事件添加ActionListener,检查长度是否为8

text.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    if(text.getText().length()==8){
      do something
    }
  }
});


text.addKeyListener(new KeyListener() {
   public void keyPressed(KeyEvent keyEvent) {
   }

   public void keyReleased(KeyEvent keyEvent) {
   }

   public void keyTyped(KeyEvent keyEvent) {
     if(text.getText().length()==4){
       do something
     }
   }
});

不确定扫描器是否也会触发这些按键事件…

我不确定变量
txfInput
在代码中的含义。但我理解你的问题。似乎可以延迟调用方法
doAction
,如果长度超过四个字符,则取消调用。你可以这样做:

private AtomicBoolean doFourCharacters = new AtomicBoolean(true);

public void actionPerformed(EventObject arg) {
    final String txfInput = arg.getSource().toString();
    if (txfInput.length() == 4) {
        doFourCharacters.set(true);
        new Timer().schedule(
                new TimerTask() {
                     @Override
                     public void run() {
                         if (doFourCharacters.get()) {
                             doAction(txfInput);
                         }
                     }
                 }, 500 /* here you should set suitable delay value */);
    } else if(txfInput.length() == 5) {
        doFourCharacters.set(false);
    } else if(txfInput.length() == 8) {
        doOtherAction(txfInput);
    }
}

答案很愚蠢,设置扫描仪扫描得更快,但@AnarAmratanov的答案可能也会起作用。

Swing代码只是一个可调试的示例,实际代码会在输入的每个字符上触发,因此它确实更像一个keylistener,当总数为8个字符时,它会在4个字符处触发,因此我通过加快速度来修复它不触发
length==4