バーコードスキャンプロジェクトに取り組んでいます。バーコード スキャナーを使用してバーコードをスキャンし、スキャナーは 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);
}
}
}
}