Java usb com leitor de cÓdigo de barras

Bom pessoal, estou com o seguite problema:

  • preciso receber o string do leitor de codio de barras e comparar seu valor (para que possa mandar o microcontrolador realizar uma ação)

  • duas soluções: a) ler o valor direto do dispositivo - jUSB, JSR80?? (não sei nem como utilizar)
    b) ler o valor do campo de texto e apontar a leitura a pistola para lá, só que:
    - isso iria ficar num loop, então como alterar o valor do campo de texto em tempo de execução(thread??)

Bem, se alguém poder me ajudar, fico muito grato!

Att,


Leiva Casemiro Oliveira

Engenharia Elétrica - UFCG
Lic. Computação - UEPB

Sr. Leiva,

Para ler o valor diretamente do dispositivo USB, quando ele está na classe HID (Human Interface Device), que é o caso de um leitor USB que simula o teclado, julgo que seja um bocadinho complicado. Portanto você precisa ler as teclas mesmo.
Normalmente é relativamente fácil - essas tais pistolas normalmente mandam um ENTER no final do código de barras a ser lido, então você precisa tratar esse ENTER.

Caro thingol,

eu já leio o valor, já comparo!.. entretanto precisaria que, dentro do loop, o valor do TextField fosse alterado

    public void actionPerformed(ActionEvent e) {
    	System.out.println("1-"+e.getID());

    	if (e.getSource().equals(B_conf)) {	//botao confirmar
    		A_test.grabFocus(); 
    		acao();
    	}	
    }	
    ...
    public void acao(){
    	for(int k = 1; k<=Integer.parseInt(A_Qnt_Amostra.getText()); k++){
    		do{
    			try {
    				Thread.sleep(3000);
    			} catch (InterruptedException e) {
    				System.out.println(e);
    			}
    			comparar = A_test.getText(); //AKI O VALOR DO CAMPO DEVERIA SER ALTERA PELA PISTOLA..a primeira vez blz..mas depois nada..ALGUMA IDÉIA?? 
    			//deliverEvent(new Event(B_conf, Event.ACTION_EVENT, null));
    		}while(!compara(k));
    	}
    }
    public boolean compara(int index){
    		boolean achou = false;
    		switch (index){
    		case 1:
    			System.out.println(comparar);
    			if(comparar.compareTo(Choice1.getItem(Choice1.getSelectedIndex())) == 0){
    				System.out.println("Igual");
    				
    				SERIAL_RS232<CommIdentifier> serial = new SERIAL_RS232<CommIdentifier>();
    				serial.inicio("0");
    				serial.fechar();
    				
    				return true;
    			}else{
    				A_test.grabFocus();
    				System.out.println("Não é igual");
    				return false;
    			}
    		case 2:
    			if(comparar.compareTo(Choice2.getItem(Choice2.getSelectedIndex())) == 0){
    				achou = true;
    				A_test.setText("");
    				return achou;
    			}
    		default:
    			return false;
    		}
    	}

Notem que, ao clicar no botão seu estado fica com o de “clicado - MouseDown”, por isso não consigo desviar o foco para o campo de texto e consequentemente atualizar o valor do campo!

Obrigado pela atenção!

Att,


Leiva Casemiro Oliveira

Engenharia Elétrica - UFCG
Lic. COmputação - UEPB

Você não pode ficar em um loop que é iniciado por um botão. Se você fizer isso, como você fez, então toda a parte gráfica é congelada, e mesmo o JTextField fica congelado.

Se você precisa investigar o valor de alguma coisa em um loop, ponha esse loop em uma thread.

Thingol meu querido,

Valeu pela ajuda…os fóruns servem para ajudar, que não necessariamente tem de ser dando a resposta de cara, mas só em informar o que não pode ajuda bastante. Fiz o seguinte:

[code] public void actionPerformed(ActionEvent e) {
System.out.println(“1-”+e.getID());

	if (e.getSource().equals(B_conf)) {	//botao confirmar
		A_test.requestFocus();
		thread_leitura = new Thread(this);
		thread_leitura.start();
	}
	
}	

public void run() {
	try{
		for(int k =1; k<=Integer.parseInt(A_Qnt_Amostra.getText()); k++){
			do{
				try {
					Thread.sleep(4000);
				} catch (InterruptedException e) {
					System.out.println(e);
				}
				A_test.requestFocus();
				comparar = A_test.getText();
			}while(!compara(k));
		}
		thread_leitura.stop();
	}catch(Exception e){
		System.out.print(e);
	}
}[/code]

Qualquer coisa tamu as ordem…

Abraço!


Leiva Casemir Oliveira

Engenharia Elétrica - UFCG
Lic. Computação - UEPB

Nao seria mais facil utilizar o metodo KeyReleased do .tx e colocar todo o seu codigo lah??? aÊ sempre q o leitor de codigo de barras jogar um valor no .tx vc pode comparar e fazer algo depedendo da situação!!

Caro Jameson_itu,

sinceramente não sei!..nunca usei o KeyReleased…o que seria .tx (um arquivo .txt???)

Se puder me fornecer mais sobre o assunto…é válido…ainda mais se for uma solução melhor1

Abraço.


Leiva Casemiro Oliveira

Engenharia Elétrica - UFCG
LIc. COmputação - UEPB

na verdade esse txt q eu me refiro seria um Jtextfield é q por força do habito sempre nomeio meus Jtextfield com txtNome txtCodigo!!rs
Utilizei este evento do Jtextfield faz pouco tempo em um projeto segue aÊ:

private void txtCodigoKeyReleased(java.awt.event.KeyEvent evt) {
DefaultTableModel modTblProdutos = (DefaultTableModel) TblProdutos.getModel();

    try{
    Integer cod = Integer.parseInt(txtCodigo.getText());

    
    produto = null;
    produto = produtoDAO.findProdutos(cod);
    if (produto != null) {
        QTD = 0;
        Integer Cod = 0;
        Cod = produto.getCodBarrasProd();
        txtNome.setText(produto.getNome());
        Integer qtd = 0;
        for (int i = 0; i < modTblProdutos.getRowCount(); i++) {
            String codTable = (String) modTblProdutos.getValueAt(i, 0);
            if (codTable.equals(txtCodigo.getText())) {
               Integer qtdTable = Integer.parseInt(modTblProdutos.getValueAt(i, 3).toString()) + Integer.parseInt(txtQuantidade.getText());

                    modTblProdutos.removeRow(i);
                    String Linha[] = {Cod.toString(), produto.getNome(),
                        produto.getDescricao(), qtdTable.toString(), produto.getEstoqueMinimo().toString(), produto.getEstoqueIdeal().toString()
                    };
                    modTblProdutos.addRow(Linha);
                    break;
                
            } else {
                Integer qtdrow = (modTblProdutos.getRowCount() - 1);
                if (i == qtdrow) {
                    String Linha[] = {Cod.toString(), produto.getNome(),
                        produto.getDescricao(), txtQuantidade.getText(), produto.getEstoqueMinimo().toString(), produto.getEstoqueIdeal().toString()
                    };
                    modTblProdutos.addRow(Linha);
                    break;
                }

            }


        }
        if (modTblProdutos.getRowCount() == 0) {
            String Linha[] = {Cod.toString(), produto.getNome(),
                produto.getDescricao(), txtQuantidade.getText(), produto.getEstoqueMinimo().toString(), produto.getEstoqueIdeal().toString()
            };
            modTblProdutos.addRow(Linha);

        }
    }        

    
    limpaControles();
    }catch(Exception ex){
          limpaControles();
          txtCodigo.requestFocus();
    }
    btnSalvar.setEnabled(true);    

}

vê c consegue entender!! na verdade este envento do Jtextfield faz com que sempre q é carregado um valor no Jtextfield ele realiza uma ação …