1

ボタンの押下をトリガーするために、スキャン中のバーコードにアプリケーションが反応するようにしたいと考えています。たとえば、ユーザーは ((PRINT)) バーコードをスキャンして、印刷ボタンをアクティブにすることができます。

バーコードは、ユーザーがテキストを入力したかのように扱われます。スキャナが最後にエンターまたはタブを追加するように設定されるのか、それとも何も追加しないように設定されるのかはわかりません。

アプリケーションは Java/Swing アプリケーションです。

キーバインディング/アクションマップなどを見てきましたが、キーコード/単一のキーエントリに焦点を当てているようです. 文字列全体が入力されるまでバインディングをトリガーしないようにする必要があります。

注意が必要な点は、ユーザーが画面のどこにいても、これが機能することです。彼らは通常 ( 文字を入力しないので、何らかのトリガーが機能する可能性があります。ただし、残りの文字列を処理する方法はわかりません。

編集:質問で明確ではなかった場合はお詫びしますが、バーコードスキャナーはアプリケーションにとって「特別」なものではなく、別のキーボードのようなものです。そのため、ユーザーは入力 (印刷) することはありませんが、それが理にかなっていれば、事実上、バーコード スキャナーはそれを実行します。

したがって、印刷をトリガーする方法は 2 つしかありません。ボタンを押すか、文字列を「入力」する (印刷) ことです。注意が必要なのは、ユーザーがアプリケーションのどこにいても集中できることです。ユーザーがどのフィールドにフォーカスしているかではなく、アプリケーション全体にフォーカスがあるかどうかだけが心配です。問題の特定の画面にはチェックボタンと左右のセレクターがあるため、ユーザーは必ずしもフィールドに入力する必要はありません。

4

4 に答える 4

3

私はあなたと同じような問題を抱えていて、swing でのバーコード処理を容易にするプロジェクト (現在、いくつかの問題を伴う概念実証) を作成しました。

これは、バーコード リーダーがキーボードをエミュレートするという事実に基づいていますが、人間とは異なり、一定のタイミングで「入力」します。基本的に、「バーコード読み取り」イベントをリッスンできます。

プロジェクトの場所: 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();
    }
}

現在、いくつかの問題がありますが、出発点としては問題ないと思います。改善する時間があれば、それは素晴らしいことです.

于 2014-02-28T01:47:06.917 に答える
1

誤解していた場合は訂正してください。ただし、フィールドにテキストを入力するバーコード スキャナーがあるようです。ただし、入力方法 (バーコード スキャナーまたはキーの押下) に関係なく、フィールド内のテキストが何かに等しい場合 (アクションを実行できるようにするため) にアラートを受け取る必要があります。

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);
            }
        });
    }   


}
于 2012-08-30T15:06:31.703 に答える
1

私は質問を完全には理解していません。コメントするには少し長すぎます。私が理解している限りでは、同じ操作をトリガーする 3 つの異なる方法を持つ Swing アプリケーションとバーコード スキャナーがあります。

  • ユーザーが UI にテキスト (「印刷」) を入力すると、印刷アクションがトリガーされます。
  • UI には、ユーザーが押すことができる印刷ボタンがあり、これにより印刷アクションがトリガーされます。
  • ユーザーは「印刷」バーコードをスキャンでき、これにより印刷アクションがトリガーされます

私が理解していない部分は、印刷アクションをトリガーする必要があるバーコードのスキャンが、ユーザーがテキストを入力できる UI 部分と関係がある理由です。

バーコードのスキャンは、イベント ディスパッチ スレッドとは別のスレッドで行われると想定しています。バーコードをスキャンして解析したら、「印刷」アクションをトリガーする必要があります。これは、UI を介さずに直接行うことができます。

于 2012-08-30T16:18:05.517 に答える