работя върху софтуер за управление на склад (за съхранение на дрехи). Всички артикули в склада имат RFID вътре, с уникален идентификатор, съхранен като низ.
Опитвам се да направя модул, който ще позволи на потребителите да четат RFID от елемент по антена и автоматично да показват получения ID в един от jLabels
на GUI. Антената е свързана с компютър от rs232
.
Успях да направя клас да чете данни от антената и работи добре. Той отваря порт за комуникация, задава свойства и чете данни, когато са налични (чрез SerialPortEvent.DATA_AVAILABLE event
).
Но тогава се сблъсках с проблем:
Искам екземпляр на този клас да работи в различна нишка, така че антената да чака сканиране и всеки път след сканиране jLabel ще се променя според идентификатора на елемента (по-късно ще бъда правя по-сложни операции с този идентификатор, свързан с моята база данни, но сега просто искам да бъде показан някъде).
Започвам своето Java приключение и не знам как да се справя с многонишковостта.
В този случай Бих искал да започна сканиране от моя Netbeans GUI jFrame
и докато сканирането ще тече, jFrame
трябва динамично да опреснява стойността на jLabel
според последния сканиран елемент.
Сценарий:
Потребителят натиска бутона, за да започне сканирането, сканира известно количество елементи, ID на всеки сканиран елемент преминава към jLabel (jReadLabel)
за времето между сканиранията и когато сканирането приключи, потребителят натиска бутона, за да спре, така че приложението да знае кога да спра нишката.
Направих getter метод в моя клас ReadCOM (getChipID()
), но не знам как да предавам данни на jFrame всеки път, когато възникне събитие. Ето какво направих досега:
import java.io.*;
import java.util.*;
import javax.comm.*;
public class ReadCOM implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static CommPortIdentifier saveportId;
static Enumeration portList;
InputStream inputStream;
SerialPort serialPort;
public static Thread readThread;
static OutputStream outputStream;
static boolean outputBufferEmptyFlag = false;
public String defaultPort;
boolean isRunning = true;
private String chip_id="";
public CzytajCOM(CommPortIdentifier portId, String defaultPort) {
this.defaultPort = defaultPort;
try {
serialPort = (SerialPort) portId.open("Magazyn", 2000);
} catch (PortInUseException e) {
System.out.println("Connection Error. Port in use.");
}
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {
}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {
}
readThread = new Thread(this);
readThread.start();
}
public void initwritetoport() {
try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {
}
try {
serialPort.notifyOnOutputEmpty(true);
} catch (Exception e) {
System.exit(-1);
}
}
public void writetoport() {
}
public void run() {
while (isRunning) {
try {
while (isRunning) {
Thread.sleep(100);
}
} catch (Exception e) {
isRunning = false;
}
}
}
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
break;
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
Object obj = event.getSource();
if (obj instanceof javax.comm.SerialPort) {
serialPort = (SerialPort) obj;
try {
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(serialPort.getInputStream()));
chip_id = bufferedReader.readLine();
//System.out.println("Data: "+chip_id);
bufferedReader.close();
} catch (Exception ex) {
System.out.println("Reading from device failed!");
}
}
break;
}
}
public boolean isRunning() {
return isRunning;
}
public String getChipId() {
return chip_id;
}
public void setIsRunning(boolean isRunning) {
this.isRunning = isRunning;
}
} И в моя jFrame файл тук е кодът на ButtonActionPerformed (бутонът, който започва и спира да чете, частта, в която съм изгубен...):
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
if(isRead==false) {
jStatus.setText("Reading in progress...");
jLabel1.setText("Press the button to stop reading.");
isRead=true;
try {
portId1=CommPortIdentifier.getPortIdentifier("COM4");
ReadCOM reader=new ReadCOM(portId1, portId1.getName());
reader.setIsRunning(true); //
jReadLabel.setText(reader.getChipId());
}
catch (Exception ex){
System.out.println("Error in button pressed method.");
}
}
else {
jStatus.setText("Reading stopped.");
jLabel1.setText("Press the button to start reading.");
isRead=false;
}
}//GEN-LAST:event_jButton1ActionPerformed
Thread.sleep(n)
, приложете SwingTimer
за повтарящи се задачи илиSwingWorker
за дълго изпълняващи се задачи. Вижте Паралелност в Swing за повече подробности. (малко по-късно, но с "връзката"). - person Andrew Thompson   schedule 12.04.2012