1

バーコードスキャンプロジェクトに取り組んでいます。バーコード スキャナーを使用してバーコードをスキャンし、スキャナーは Bluetooth 経由でラップトップと通信します。Bluetooth 接続は、シリアル ポート通信としてエミュレートされます。

スキャンしたバーコードを取得して表示する Java デスクトップ アプリケーションを開発しました。UI に Javafx を使用し、オープン ソース ライブラリ JSSC (Java Simple Serial Connector) を使用して、シリアル ポートをリッスンし、スキャンしたバーコードを取得します。ただし、JSSC serialPort が追加/開始されると、新しいスレッドが作成されます。この新しいスレッドは、シリアル ポートをリッスンし、スキャンされたバーコードを取得します。私が望むのは、スキャンしたバーコードを Javafx UI に表示することです。JSSC リスナー スレッドで取得したバーコードを親 Javafx アプリケーション スレッドに送り返す必要があります。

javafx.concurrent パッケージを調査しましたが、JSSC がスレッドの作成を独自のクラスにラップしていて、それを制御できないことがわかりました。誰かがそれに対する解決策を提案できますか? Javafx コントローラー内で JSSC リスナーを開始するためのコード スニペットを次に示します。基本的に、バッファをFXMLラベル変数バーコードに戻すにはどうすればよいですか?

事前に本当に感謝します!

public class BarcodeScanningController {
    @FXML
    private Label barcode;

    private static SerialPort serialPort;

    @FXML
    void initialize() {
        serialPort = new SerialPort("COM5");
        try {
            if (serialPort!=null && serialPort.isOpened ()) {
                serialPort.closePort();
            }
            serialPort.openPort();

            serialPort.setParams(SerialPort.BAUDRATE_9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
            int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
            serialPort.setEventsMask(mask);//Set mask
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN |
                SerialPort.FLOWCONTROL_RTSCTS_OUT);

            serialPort.addEventListener(new PortReader(),SerialPort.MASK_RXCHAR);
        } catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }

    private class PortReader implements SerialPortEventListener {
        private String buffer;

        @Override
        public void serialEvent(SerialPortEvent event) {
            if(event.isRXCHAR()){
                try {
                    buffer = serialPort.readString();
                    System.out.println(buffer);
                } catch (SerialPortException ex) {
                    System.out.println(ex);
                }
        }
    }
}
4

1 に答える 1

4

クラスに a を追加Consumer<String>します。PortReader

private class PortReader implements SerialPortEventListener {
    private final Consumer<String> textHandler ;

    PortReader(Consumer<String> textHandler) {
        this.textHandler = textHandler ;
    }

    @Override
    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR()){
            try {
                String buffer = serialPort.readString();
                textHandler.accept(buffer);
            } catch (SerialPortException ex) {
                System.out.println(ex);
            }
    }
}

あとは交換するだけ

serialPort.addEventListener(new PortReader(),SerialPort.MASK_RXCHAR);

serialPort.addEventListener(
    new PortReader(buffer -> Platform.runLater(() -> barCode.setText(buffer))),
    SerialPort.MASK_RXCHAR);
于 2015-07-09T12:00:17.353 に答える